Commit 25e879c0 authored by 李丛阳's avatar 李丛阳

education

parent 33e7d7ee
......@@ -304,10 +304,10 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!--<configuration>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>-->
</configuration>
</plugin>
</plugins>
</build>
......
package org.rcisoft.common.component;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Created by lcy on 17/11/23.
*/
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
//@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
applicationContext = ctx;
}
/**
* Get application context from everywhere
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* Get bean by class
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
/**
* Get bean by class name
*
* @param name
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
}
This diff is collapsed.
package org.rcisoft.config;
import org.rcisoft.core.bean.JwtBean;
import org.rcisoft.core.security.JwtAuthenTokenFilter;
import org.rcisoft.core.security.RestAuthenticationEntryPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
/**
* Created by lcy on 17/11/23.
*/
@Configuration
@EnableWebSecurity //开启WebSecurity支持
@EnableGlobalMethodSecurity(prePostEnabled = true) //开启prePostEnabled注解支持
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService jwtUserDetailServiceImpl;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(jwtUserDetailServiceImpl)
.passwordEncoder(passwordEncoder());
}
/**
* 密码加密的bean,使用BCrypt
* @return
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* json web token
* @return
*/
@Bean
JwtBean jwtBean(){
return new JwtBean();
}
/**
* 前置过滤器
* @return
*/
@Bean
JwtAuthenTokenFilter authenticationTokenFilterBean(){
return new JwtAuthenTokenFilter();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable() //由于使用的是JWT,我们这里不需要csrf
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //禁用session
.and()
.authorizeRequests() //所有请求都要验证
.antMatchers("/static/**").permitAll() //过滤 允许
.antMatchers("/webjars/**").permitAll()
.antMatchers("/v2/**").permitAll()
.antMatchers("/swagger-resources/**").permitAll()
.antMatchers("/swagger-resources/**").permitAll()
.antMatchers("/auth/**").permitAll() //登录注册等请求过滤
.antMatchers("/code/**").permitAll() //登录注册等请求过滤
.antMatchers(
"/",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.js",
"/**/*.css"
).permitAll() //静态资源过滤
.anyRequest().fullyAuthenticated()
.and()
.exceptionHandling() //验证不通过的配置
.authenticationEntryPoint(new RestAuthenticationEntryPoint())
;
http //添加前置过滤器
.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
http //禁用header缓存
.headers().cacheControl();
}
}
package org.rcisoft.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Created by lcy on 17/11/24.
*/
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("org.yxyqcy"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot利用swagger构建api文档")
.description("简单优雅的restfun风格,http://blog.csdn.net/saytime")
.termsOfServiceUrl("http://blog.csdn.net/saytime")
.version("1.0")
.build();
}
}
package org.rcisoft.core.aop;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.rcisoft.core.entity.IdEntity;
import org.rcisoft.core.util.IdGen;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* Created by lcy on 17/11/23.
*/
@Aspect
@Component
public class IdGenAspect {
/**
* 插入前 判断是否 存在id
* @param joinPoint
*/
@Before("execution(* org.yxyqcy..*.dao.*Mapper.insert*(..))")
public void beforeInsert(JoinPoint joinPoint){
Object model = joinPoint.getArgs()[0];
if(model instanceof IdEntity) {
IdEntity idEntity = (IdEntity) model;
/*id null*/
if(StringUtils.isBlank(idEntity.getBusinessId()))
idEntity.setBusinessId(IdGen.uuid());
/*create date is null*/
if(null == idEntity.getCreateDate())
idEntity.setCreateDate(new Date());
}
}
}
package org.rcisoft.core.bean;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import java.util.Date;
import java.util.Map;
/**
* Created by lcy on 17/11/21.
*/
public class JwtBean {
@Value("${jwt.secret}")
private String secret;
/**
* 根据token获取用户信息
*/
public Claims getClaimsFromToken(String token){
try {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token).getBody();
return claims;
}catch (Exception e){
return null;
}
}
/**
* 设置用户信息进jwt
*/
public String generateToken(String subject, Map<String,Object> map){
String token = Jwts
.builder()
.setClaims(map)
.setSubject(subject)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
return token;
}
}
package org.rcisoft.core.druid;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* @author liuzh
* @since 2017/2/5.
*/
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
@ConditionalOnClass(DruidDataSource.class)
@ConditionalOnProperty(prefix = "druid", name = "username")//name 随便 druid 下有对应属性即可
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class DruidAutoConfiguration {
@Autowired
private DruidProperties properties;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
if (properties.getInitialSize() > 0) {
dataSource.setInitialSize(properties.getInitialSize());
}
if (properties.getMinIdle() > 0) {
dataSource.setMinIdle(properties.getMinIdle());
}
if (properties.getMaxActive() > 0) {
dataSource.setMaxActive(properties.getMaxActive());
}
dataSource.setTestOnBorrow(properties.isTestOnBorrow());
try {
dataSource.init();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return dataSource;
}
}
package org.rcisoft.core.druid;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 只提供了常用的属性,如果有需要,自己添加
*
* @author liuzh
* @since 2017/2/5.
*/
@ConfigurationProperties(prefix = "druid")
public class DruidProperties {
private String url;
private String username;
private String password;
private String driverClass;
private int maxActive;
private int minIdle;
private int initialSize;
private boolean testOnBorrow;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClass() {
return driverClass;
}
public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
}
package org.rcisoft.core.druid;
import com.alibaba.druid.support.http.WebStatFilter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
/**
* Created by lcy on 17/11/23.
*/
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",
initParams={
@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
})
public class DruidStatFilter extends WebStatFilter {
}
package org.rcisoft.core.druid;
import com.alibaba.druid.support.http.StatViewServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
* Created by lcy on 17/11/23.
*/
@SuppressWarnings("serial")
@WebServlet(urlPatterns = "/druid/*",
initParams={
//@WebInitParam(name="allow",value="192.168.16.110,127.0.0.1"),// IP白名单 (没有配置或者为空,则允许所有访问)
@WebInitParam(name="deny",value="192.168.16.111"),// IP黑名单 (存在共同时,deny优先于allow)
@WebInitParam(name="loginUsername",value="cy"),// 用户名
@WebInitParam(name="loginPassword",value="pass"),// 密码
@WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewServlet {
}
package org.rcisoft.core.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.rcisoft.core.anno.OperateFlagAnno;
import org.rcisoft.core.constant.DelStatus;
import org.rcisoft.core.constant.FlagStatus;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.util.Date;
/**
* Created with family.
* author: cy
* Date: 16/6/23
* Time: 上午10:04
* description: data 实体 常用属性
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
public abstract class DataEntity<T> implements Serializable {
private static final long serialVersionUID = 1L;
protected String remarks; // 备注
protected String createBy; // 创建者
protected Date createDate;// 创建日期
@OperateFlagAnno
protected String updateBy; // 更新者
@OperateFlagAnno(jdbcTypeName = "TIMESTAMP")
protected Date updateDate;// 更新日期
@OperateFlagAnno
protected String delFlag ; // 删除标记(0:正常;1:删除;2:审核)
@OperateFlagAnno
protected String flag ; // 启用标记(0:停用;1:启用)
/**
* 设置删除
*/
public void setDeleted(){
this.setDelFlag(DelStatus.DELETED.getStatus());
}
/**
* 设置非删除
*/
public void setNotDeleted(){
this.setDelFlag(DelStatus.NORMAL.getStatus());
}
/**
* 设置启用
*/
public void setStart(){
this.setDelFlag(FlagStatus.NORMAL.getStatus());
}
/**
* 设置停用
*/
public void setStop(){
this.setDelFlag(FlagStatus.ABNORMAL.getStatus());
}
}
package org.rcisoft.core.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.rcisoft.core.util.IdGen;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
* Created with family.
* author: cy
* Date: 16/6/2
* Time: 上午9:15
* description: id entity
*/
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@Data
public abstract class IdEntity<T> extends DataEntity<T> implements Serializable {
private static final long serialVersionUID = 1L;
@Id
protected String businessId; // 编号
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
/**
* 通用设置ID
*/
public void setCommonBusinessId(){
this.setBusinessId(IdGen.uuid());
}
}
\ No newline at end of file
package org.rcisoft.core.exception;
import org.rcisoft.core.result.ResultExceptionEnum;
/**
* Created by lcy on 17/11/24.
*/
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 3729706443523052156L;
Integer code;
public ServiceException() {
}
public ServiceException(ResultExceptionEnum resultEnum){
super(resultEnum.getMessage());
code = resultEnum.getCode();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(Integer code, String message) {
super(message);
this.code = code;
}
}
package org.rcisoft.core.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
/**
* Created by lcy on 17/11/21.
*/
@Data
public class JwtUser implements UserDetails{
private static final long serialVersionUID = -4070913768662945949L;
private final String businessId;
private final String username;
private final String password;
/** 权限类.*/
private final Collection<? extends GrantedAuthority> authorities;
/**
* 在createJwtFactory里注入
*/
public JwtUser(String id,
String username,
String password,
Collection<? extends GrantedAuthority> authorities) {
this.businessId = id;
this.username = username;
this.password = password;
this.authorities = authorities;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
@JsonIgnore
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@JsonIgnore
public boolean isAccountNonExpired() {
return true;
}
@JsonIgnore
public boolean isAccountNonLocked() {
return true;
}
@JsonIgnore
public boolean isCredentialsNonExpired() {
return true;
}
@JsonIgnore
public boolean isEnabled() {
return true;
}
}
package org.rcisoft.core.model;
import com.github.pagehelper.Page;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* @descript 分页信息
* @author cy
* Created by cy on 16/5/20.
*/
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = -3480714604668028816L;
private int pageNum;
private int pageSize;
private int size;
private String orderBy;
private int startRow;
private int endRow;
private long total;
private int pages;
private List<T> list;
private int firstPage;
private int prePage;
private int nextPage;
private int lastPage;
private boolean isFirstPage;
private boolean isLastPage;
private boolean hasPreviousPage;
private boolean hasNextPage;
private int navigatePages;
private int[] navigatepageNums;
public PageInfo() {
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
}
public PageInfo(List<T> list) {
this(list, 8);
}
public PageInfo(List<T> list, int navigatePages) {
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
if(list instanceof Page) {
Page page = (Page)list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
//this.orderBy = page.get();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
this.total = page.getTotal();
if(this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
this.endRow = this.startRow - 1 + this.size;
}
} else if(list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = 1;
this.list = list;
this.size = list.size();
this.total = (long)list.size();
this.startRow = 0;
this.endRow = list.size() > 0?list.size() - 1:0;
}
if(list instanceof Collection) {
this.navigatePages = navigatePages;
this.calcNavigatepageNums();
this.calcPage();
this.judgePageBoudary();
}
}
private void calcNavigatepageNums() {
int startNum;
if(this.pages <= this.navigatePages) {
this.navigatepageNums = new int[this.pages];
for(startNum = 0; startNum < this.pages; ++startNum) {
this.navigatepageNums[startNum] = startNum + 1;
}
} else {
this.navigatepageNums = new int[this.navigatePages];
startNum = this.pageNum - this.navigatePages / 2;
int endNum = this.pageNum + this.navigatePages / 2;
int i;
if(startNum < 1) {
startNum = 1;
for(i = 0; i < this.navigatePages; ++i) {
this.navigatepageNums[i] = startNum++;
}
} else if(endNum > this.pages) {
endNum = this.pages;
for(i = this.navigatePages - 1; i >= 0; --i) {
this.navigatepageNums[i] = endNum--;
}
} else {
for(i = 0; i < this.navigatePages; ++i) {
this.navigatepageNums[i] = startNum++;
}
}
}
}
private void calcPage() {
if(this.navigatepageNums != null && this.navigatepageNums.length > 0) {
this.firstPage = this.navigatepageNums[0];
this.lastPage = this.navigatepageNums[this.navigatepageNums.length - 1];
if(this.pageNum > 1) {
this.prePage = this.pageNum - 1;
}
if(this.pageNum < this.pages) {
this.nextPage = this.pageNum + 1;
}
}
}
private void judgePageBoudary() {
this.isFirstPage = this.pageNum == 1;
this.isLastPage = this.pageNum == this.pages;
this.hasPreviousPage = this.pageNum > 1;
this.hasNextPage = this.pageNum < this.pages;
}
public int getPageNum() {
return this.pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return this.pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getSize() {
return this.size;
}
public void setSize(int size) {
this.size = size;
}
public String getOrderBy() {
return this.orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
public int getStartRow() {
return this.startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getEndRow() {
return this.endRow;
}
public void setEndRow(int endRow) {
this.endRow = endRow;
}
public long getTotal() {
return this.total;
}
public void setTotal(long total) {
this.total = total;
}
public int getPages() {
return this.pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public List<T> getList() {
return this.list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getFirstPage() {
return this.firstPage;
}
public void setFirstPage(int firstPage) {
this.firstPage = firstPage;
}
public int getPrePage() {
return this.prePage;
}
public void setPrePage(int prePage) {
this.prePage = prePage;
}
public int getNextPage() {
return this.nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getLastPage() {
return this.lastPage;
}
public void setLastPage(int lastPage) {
this.lastPage = lastPage;
}
public boolean isIsFirstPage() {
return this.isFirstPage;
}
public void setIsFirstPage(boolean isFirstPage) {
this.isFirstPage = isFirstPage;
}
public boolean isIsLastPage() {
return this.isLastPage;
}
public void setIsLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
public boolean isHasPreviousPage() {
return this.hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public boolean isHasNextPage() {
return this.hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public int getNavigatePages() {
return this.navigatePages;
}
public void setNavigatePages(int navigatePages) {
this.navigatePages = navigatePages;
}
public int[] getNavigatepageNums() {
return this.navigatepageNums;
}
public void setNavigatepageNums(int[] navigatepageNums) {
this.navigatepageNums = navigatepageNums;
}
public String toString() {
StringBuffer sb = new StringBuffer("PageInfo{");
sb.append("pageNum=").append(this.pageNum);
sb.append(", pageSize=").append(this.pageSize);
sb.append(", size=").append(this.size);
sb.append(", startRow=").append(this.startRow);
sb.append(", endRow=").append(this.endRow);
sb.append(", total=").append(this.total);
sb.append(", pages=").append(this.pages);
sb.append(", list=").append(this.list);
sb.append(", firstPage=").append(this.firstPage);
sb.append(", prePage=").append(this.prePage);
sb.append(", nextPage=").append(this.nextPage);
sb.append(", lastPage=").append(this.lastPage);
sb.append(", isFirstPage=").append(this.isFirstPage);
sb.append(", isLastPage=").append(this.isLastPage);
sb.append(", hasPreviousPage=").append(this.hasPreviousPage);
sb.append(", hasNextPage=").append(this.hasNextPage);
sb.append(", navigatePages=").append(this.navigatePages);
sb.append(", navigatepageNums=");
if(this.navigatepageNums == null) {
sb.append("null");
} else {
sb.append('[');
for(int i = 0; i < this.navigatepageNums.length; ++i) {
sb.append(i == 0?"":", ").append(this.navigatepageNums[i]);
}
sb.append(']');
}
sb.append('}');
return sb.toString();
}
}
\ No newline at end of file
package org.rcisoft.core.model;
/**
* Created with family.
* author: cy
* Date: 16/6/22
* Time: 上午9:13
* description:
*/
public class PersistModel {
public PersistModel(int influence) {
this.influence = influence;
}
private int influence;
private String influenceReason = "";
public String getInfluenceReason() {
return influenceReason;
}
public PersistModel(int influence, String influenceReason) {
this.influence = influence;
this.influenceReason = influenceReason;
}
/**
* 单一插入是否成功
* @return 是否成功
*/
public boolean isSuccessBySinglePersist(){
if(1 <= influence)
return true;
return false;
}
}
package org.rcisoft.core.result;
import lombok.Getter;
/**
* Created by lcy on 17/11/24.
*/
@Getter
public enum AuthExceptionEnum {
ACCESS_DENIED(4031,"权限不足"),
LOGIN_PARAM_ERROR(4302,"用户名密码错误"),
AUTH_HEADER_ERROR(4304,"不合法的token验证"),
;
private Integer code;
private String message;
AuthExceptionEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
package org.rcisoft.core.result;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonView;
/**
* 统一API响应结果封装
*/
public class Result {
private int code;
private String message;
private Object data;
public interface DefulatJsonView{}
public Result setCode(ResultCode resultCode) {
this.code = resultCode.code;
return this;
}
@JsonView(DefulatJsonView.class)
public int getCode() {
return code;
}
public Result setCode(int code) {
this.code = code;
return this;
}
@JsonView(DefulatJsonView.class)
public String getMessage() {
return message;
}
public Result setMessage(String message) {
this.message = message;
return this;
}
@JsonView(DefulatJsonView.class)
public Object getData() {
return data;
}
public Result setData(Object data) {
this.data = data;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
package org.rcisoft.core.result;
/**
* 响应码枚举,参考HTTP状态码的语义
*/
public enum ResultCode {
SUCCESS(200),//成功
FAIL(400),//失败
UNAUTHORIZED(401),//未认证(签名错误)
NOT_FOUND(404),//接口不存在
INTERNAL_SERVER_ERROR(500);//服务器内部错误
public int code;
ResultCode(int code) {
this.code = code;
}
}
package org.rcisoft.core.result;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* Created by lcy on 17/11/24.
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ResultExceptionEnum {
USER_EXISTS(4001,"用户已经存在"),
USER_NOT_EXISTS(4002,"用户不存在"),
SAVE_ERROR(4003,"添加失败"),
PARAM_ERROR(4004,"参数错误"),
OS_NOT_FOUND(4005,"操作系统不存在"),
SERVER_NOT_FOUND(4006,"服务器不存在"),
SERVER_HAS_APP(4007,"服务器仍有关联应用,不可删除"),
OS_HAS_SERVER(4008,"操作系统仍有关联服务器,不可删除"),
;
private Integer code;
private String message;
}
package org.rcisoft.core.security;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.core.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by lcy on 17/11/21.
*/
@Slf4j
public class JwtAuthenTokenFilter extends OncePerRequestFilter {
@Value("${jwt.header}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
private UserDetailsService jwtUserDetailServiceImpl;
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
response.setHeader("Access-Control-Allow-Headers","Authorization,Origin,X-Requested-With,X-File-Name,Content-Type, Accept");
log.info("*********************************过滤器被使用**************************");
// 取得header
String authHeader = request.getHeader(this.tokenHeader);
//判断header头
if (authHeader != null && authHeader.startsWith(tokenHead)) {
// The part after "Bearer "
final String authToken = authHeader.substring(tokenHead.length());
//从jwt中获取信息,如果要缓存很多信息可以用Claims
String username = JwtUtil.getUsernameFromToken(authToken);
logger.info("checking authentication " + username);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.jwtUserDetailServiceImpl.loadUserByUsername(username); //验证jwt的信息是否正确
if (JwtUtil.validateToken(authToken, userDetails)) {
//将验证信息放入SecurityContextHolder中,UsernamePasswordAuthenticationToken是Security验证账号密码的工具类
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(
request));
logger.info("authenticated user " + username + ", setting security context");
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}
filterChain.doFilter(request, response);
}
}
package org.rcisoft.core.security;
import org.rcisoft.core.result.Result;
import org.rcisoft.core.result.ResultCode;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by lcy on 17/11/23.
*/
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
/**
* 实现AuthenticationEntryPoint的commence方法自定义校验不通过的方法
*
* @param request
* @param response
* @param e
* @throws IOException
* @throws ServletException
*/
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
// 捕获AuthenticationException中的message,并封装成自定义异常抛出
response.setCharacterEncoding("utf-8");
//header 起作用
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.getWriter().write(new Result().setCode(ResultCode.UNAUTHORIZED).setMessage("无权限").toString());
}
}
\ No newline at end of file
package org.rcisoft.core.util;
import java.security.SecureRandom;
import java.util.UUID;
/**
* Created with family.
* author: cy
* Date: 16/6/2
* Time: 上午9:27
* description:
*/
public class IdGen {
private static SecureRandom random = new SecureRandom();
/**
* 封装JDK自带的UUID, 通过Random数字生成, 中间无-分割.
*/
public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
package org.rcisoft.core.util;
import org.rcisoft.core.model.JwtUser;
import org.rcisoft.sys.user.entity.SysUser;
import org.springframework.security.core.GrantedAuthority;
import java.util.ArrayList;
/**
* Created by lcy on 17/11/21.
*/
public final class JwtUserFactory {
private JwtUserFactory() {
}
/**
* 创建JwtUser工厂
*/
public static JwtUser create(SysUser user){
return new JwtUser(
user.getBusinessId(),
user.getUsername(),
user.getPassword(),
new ArrayList<GrantedAuthority>()
);
}
/**
* 讲User的List<Role>转换成JwtUser<GrantedAuthority>
private static List<GrantedAuthority> map2GrantedAuthorities(List<SysRole> authorities){
return authorities.stream()
.map(e -> role2SimpleGrantedAuthority(e))
.collect(Collectors.toList());
}
private static SimpleGrantedAuthority role2SimpleGrantedAuthority(SysRole role){
return new SimpleGrantedAuthority(role.getName());
}
*/
}
package org.rcisoft.core.util;
import io.jsonwebtoken.Claims;
import org.apache.commons.collections.map.HashedMap;
import org.rcisoft.core.bean.JwtBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by lcy on 17/11/21. *
* header.payload.signature
*
*
*/
@Component
public class JwtUtil {
public JwtUtil() {
}
private static JwtBean jwtBean;
@Autowired
private JwtUtil(JwtBean jwtBean){
this.jwtBean = jwtBean;
}
/**
* 根据token获取用户名
*/
public static String getUsernameFromToken(String token){
try {
Claims claims = jwtBean.getClaimsFromToken(token);
String username = claims.getSubject();
return username;
}catch (Exception e){
return null;
}
}
/**
* 设置用户信息进jwt
*/
public static String generateToken(UserDetails userDetails){
Map<String,Object> map = new HashedMap();
map.put(userDetails.getUsername(),userDetails);
String token = jwtBean.generateToken(userDetails.getUsername(),map);
return token;
}
/**
* 验证token是否正确
* @param token
* @param userDetails
* @return
*/
public static boolean validateToken(String token,UserDetails userDetails){
Claims claims = jwtBean.getClaimsFromToken(token);
LinkedHashMap<String,Object> tokenUserDetails = (LinkedHashMap<String,Object>) claims.get(userDetails.getUsername());
boolean usernameValid = userDetails.getUsername().equals(tokenUserDetails.get("username"));
boolean passwordValid = userDetails.getPassword().equals(tokenUserDetails.get("password"));
if(usernameValid||passwordValid) // ?? &&
return true;
else
return false;
}
}
package org.rcisoft.core.util;
import org.rcisoft.core.result.Result;
import org.rcisoft.core.result.ResultCode;
/**
* Created by lcy on 17/11/24.
*/
public class ResultGenerator {
private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
public static Result genSuccessResult() {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE);
}
public static Result genSuccessResult(Object data) {
return new Result()
.setCode(ResultCode.SUCCESS)
.setMessage(DEFAULT_SUCCESS_MESSAGE)
.setData(data);
}
public static Result genFailResult(String message) {
return new Result()
.setCode(ResultCode.FAIL)
.setMessage(message);
}
}
package org.rcisoft.sys.controller;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.rcisoft.core.result.Result;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by lcy on 17/8/13.
*/
@RestController
@RequestMapping(value = "sys")
public class SysController {
/**
* login
* @param
* @param
* @return
@PostMapping(value = "/login")
public AjaxResponse login(String account, String pwd,AjaxResponse response){
Map<String,Object> map = new HashMap<String,Object>();
User user = null;
//登录成功
String token = JwtUtil.setClaim(account);
map.put("user", user);
map.put("token", token);
response.setSuccessMessage("登录成功",map);
return response;
}*/
@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer", paramType = "path")
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET,produces = "application/json; charset=utf-8")
public Result testApi(@PathVariable(value = "id") Integer id, Result result){
result.setCode(400);
result.setData(id);
return result;
}
}
package org.rcisoft.sys.model;
public class AjaxResponse {
private String state;
private String message ;
private Object result;
private final String SUCCESS_STATE="200";
private final String ERROR_STATE="999";
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
/**
* 成功提示
* @param message
* @param result
*/
public void setSuccessMessage(String message, Object result){
this.setState(SUCCESS_STATE);
this.setMessage(message);
this.setResult(result);
}
/**
* 失败提示
* @param message
* @param result
*/
public void setErrorMessage(String message, Object result){
this.setState(ERROR_STATE);
this.setMessage(message);
this.setResult(result);
}
}
package org.rcisoft.sys.user.controller;
import org.rcisoft.sys.model.AjaxResponse;
import org.rcisoft.sys.user.entity.SysUser;
import org.rcisoft.sys.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Andrew on 2017/7/6.
*/
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserService userServiceImpl;
@RequestMapping(value = "/addUser")
public AjaxResponse addUser(SysUser user, AjaxResponse response){
try{
userServiceImpl.addUser(user);
response.setErrorMessage("添加失败",null);
}catch (Exception e){
e.printStackTrace();
response.setErrorMessage(e.getMessage(),"");
}
return response;
}
}
package org.rcisoft.sys.user.dao;
import org.rcisoft.core.base.BaseMapper;
import org.rcisoft.sys.user.entity.SysUser;
/**
* Created by lcy on 17/8/9.
*/
public interface SysUserMapper extends BaseMapper<SysUser> {
}
package org.rcisoft.sys.user.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.rcisoft.core.entity.IdEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* Created by lcy on 17/11/21.
*/
@Entity
@Table(name = "s_user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SysUser extends IdEntity<SysUser> {
private static final long serialVersionUID = 8885558381185320493L;
/** 密码 */
private String password;
/** 用户名 */
private String username;
/** 用户名 */
private String name;
}
package org.rcisoft.sys.user.service;
import org.rcisoft.core.model.PersistModel;
import org.rcisoft.sys.user.entity.SysUser;
public interface UserService {
PersistModel addUser(SysUser user);
}
package org.rcisoft.sys.user.service.impl;
import org.rcisoft.core.model.PersistModel;
import org.rcisoft.sys.user.dao.SysUserMapper;
import org.rcisoft.sys.user.entity.SysUser;
import org.rcisoft.sys.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true,propagation = Propagation.NOT_SUPPORTED)
public class UserServiceImpl implements UserService {
@Autowired
private SysUserMapper sysUserMapper;
@Transactional(propagation = Propagation.REQUIRED,readOnly = false)
@Override
public PersistModel addUser(SysUser user) {
int line = sysUserMapper.insertSelective(user);
return new PersistModel(line);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment