diff --git a/springboot_spirngsecurity_demo/pom.xml b/springboot_spirngsecurity_demo/pom.xml
new file mode 100644
index 0000000..51edfb0
--- /dev/null
+++ b/springboot_spirngsecurity_demo/pom.xml
@@ -0,0 +1,78 @@
+
+
+ 4.0.0
+
+ com.example
+ springboot_spirngsecurity_demo
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot_spirngsecurity_demo
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Finchley.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 1.3.2
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/SpringbootSpirngsecurityDemoApplication.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/SpringbootSpirngsecurityDemoApplication.java
new file mode 100644
index 0000000..1ecc8e4
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/SpringbootSpirngsecurityDemoApplication.java
@@ -0,0 +1,24 @@
+package com.example.demo;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+@SpringBootApplication
+@EnableTransactionManagement
+@MapperScan("com.example.demo.mapper")
+public class SpringbootSpirngsecurityDemoApplication extends WebMvcConfigurationSupport {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringbootSpirngsecurityDemoApplication.class, args);
+ }
+
+ @Override
+ protected void configurePathMatch(PathMatchConfigurer configurer) {
+ configurer.setUseSuffixPatternMatch(false) //设置路由是否后缀匹配,譬如/user能够匹配/user.,/user.aa
+ .setUseTrailingSlashMatch(false); //设置是否后缀路径匹配,比如/user能够匹配/user,/user/
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/PublicController.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/PublicController.java
new file mode 100644
index 0000000..66aa84f
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/PublicController.java
@@ -0,0 +1,33 @@
+package com.example.demo.controller;
+
+import com.example.demo.entity.User;
+import com.example.demo.service.UserService;
+import com.example.demo.util.Reply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class PublicController {
+
+ @Autowired
+ private UserService userService;
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ //注册账号
+ @PostMapping("/public/register")
+ public Reply register(User user) {
+ userService.register(user);
+ return new Reply("注册成功");
+ }
+
+// //未登录提示错误
+// @GetMapping("/public/unlogin")
+// public Reply unLoginError() {
+// ErrorCode code= ErrorCode.UNLOGIN;
+// return new Reply(code.getCode(),code.getMess());
+// }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/UserController.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/UserController.java
new file mode 100644
index 0000000..ae4d92e
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/controller/UserController.java
@@ -0,0 +1,37 @@
+package com.example.demo.controller;
+
+import com.example.demo.service.UserService;
+import com.example.demo.util.Reply;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class UserController {
+
+ @Autowired
+ private UserService userService;
+
+ //获取用户列表
+ @GetMapping("/user")
+ public Object getAllUser(){
+ return new Reply(userService.getAll());
+ }
+
+ @GetMapping("/user/{userId}")
+ public Object getOne(@PathVariable int userId){
+ return new Reply(userService.getOne(userId));
+ }
+
+ @GetMapping("/user/{userId}/12")
+ public Object getTwo(@PathVariable int userId){
+ return new Reply(userService.getOne(userId));
+ }
+
+ @PostMapping("/user")
+ public void insert(){
+ userService.insert();
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Jurisdiction.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Jurisdiction.java
new file mode 100644
index 0000000..05b3369
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Jurisdiction.java
@@ -0,0 +1,59 @@
+package com.example.demo.entity;
+
+public class Jurisdiction {
+ private int id;
+ private String permission;
+ private String description;
+ private String url;
+ private String method;
+
+ public Jurisdiction() {}
+
+ public Jurisdiction(int id, String permission, String description, String url, String method) {
+ this.id = id;
+ this.permission = permission;
+ this.description = description;
+ this.url = url;
+ this.method = method;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getPermission() {
+ return permission;
+ }
+
+ public void setPermission(String permission) {
+ this.permission = permission;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Role.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Role.java
new file mode 100644
index 0000000..8b15e0a
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/Role.java
@@ -0,0 +1,33 @@
+package com.example.demo.entity;
+
+public class Role {
+ private int id;
+ private String name;
+
+ public Role() {
+
+ }
+
+ public Role(int id, String name) {
+ super();
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/User.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/User.java
new file mode 100644
index 0000000..c0c8347
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/entity/User.java
@@ -0,0 +1,103 @@
+package com.example.demo.entity;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.List;
+
+public class User implements UserDetails{
+ private static final long serialVersionUID = 1L;
+ private int id;
+ private String password;
+ private String name;
+ private short age;
+ List authorities;
+ public User() {
+ }
+
+ public User(int id,String password, String name,short age) {
+ this.id = id;
+ this.password = password;
+ this.name = name;
+ this.age = age;
+ }
+
+ @Override
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public short getAge() {
+ return age;
+ }
+
+ public void setAge(short age) {
+ this.age = age;
+ }
+
+
+ public void setAuthorities(List authorities) {
+ this.authorities = authorities;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + ", password=" + password + ", name=" + name + ", age=" + age + "]";
+ }
+
+ @Override
+ public Collection getAuthorities() {
+ return this.authorities;
+ }
+
+ @Override
+ public String getUsername() {
+ return String.valueOf(this.id);
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ErrorCode.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ErrorCode.java
new file mode 100644
index 0000000..3a84bc0
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ErrorCode.java
@@ -0,0 +1,27 @@
+package com.example.demo.error;
+
+public enum ErrorCode {
+ OK(0,"正常"),
+ UNLOGIN(1,"未登录"),
+ NO_PERMISSION(2,"无操作权限"),
+ SERVICE_ERROR(3,"服务发生错误"),
+ BAD_REQUEST(4,"请求无法执行"),
+ HAD_LOGIN(5,"已登录"),
+ WRONG_LOGIN_INFO(6,"账号密码错误"),
+ UNKONWN_ERROR(555,"其他错误");
+
+ private final int code;
+ private final String mess;
+ private ErrorCode(int code,String mess) {
+ this.code = code;
+ this.mess = mess;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMess() {
+ return mess;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ExceptionHandle.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ExceptionHandle.java
new file mode 100644
index 0000000..627ee95
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ExceptionHandle.java
@@ -0,0 +1,39 @@
+package com.example.demo.error;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.converter.HttpMessageConversionException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import com.example.demo.util.Reply;
+
+@RestControllerAdvice
+public class ExceptionHandle {
+ private static final Logger log = LoggerFactory.getLogger(ExceptionHandle.class);
+
+ // 运行时异常捕捉
+ @ExceptionHandler(RuntimeException.class)
+ public Object handleRuntionException(RuntimeException e) {
+ if (e instanceof HttpMessageConversionException) {
+ log.error("bad request:{},{}", e.getMessage(), e);
+ return new Reply(ErrorCode.BAD_REQUEST.getCode(), "参数无法理解");
+ }
+ if (e instanceof ServiceError) {
+ log.error("业务错误:{},{}", e.getMessage(), e);
+ return new Reply(((ServiceError) e).getErrorCode(), e.getMessage());
+ }
+ if (e instanceof RuntimeException) {
+ return new Reply(ErrorCode.SERVICE_ERROR.getCode(),e.getMessage() );
+ }
+ log.error("其他错误:{},{}", e.getMessage(), e);
+ return new Reply(ErrorCode.UNKONWN_ERROR.getCode(), "未知错误");
+ }
+
+ // 全局异常捕捉
+ @ExceptionHandler(Exception.class)
+ public Object handleException(Exception e) {
+ log.error("未处理异常:{}\n{}", e.getMessage(), e);
+ return new Reply(ErrorCode.UNKONWN_ERROR.getCode(), "未处理异常");
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ServiceError.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ServiceError.java
new file mode 100644
index 0000000..6b7c2ab
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/ServiceError.java
@@ -0,0 +1,30 @@
+package com.example.demo.error;
+
+public class ServiceError extends RuntimeException{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private int errorCode;
+
+ public ServiceError(String message) {
+ super(message);
+ this.errorCode = ErrorCode.SERVICE_ERROR.getCode();
+ }
+
+ public ServiceError(int code,String message) {
+ super(message);
+ this.errorCode = code;
+ }
+
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(int errorCode) {
+ this.errorCode = errorCode;
+ }
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/UnloginError.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/UnloginError.java
new file mode 100644
index 0000000..73afe94
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/error/UnloginError.java
@@ -0,0 +1,22 @@
+package com.example.demo.error;
+
+public class UnloginError extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ private int errorCode;
+
+ public UnloginError() {
+ super("未登录");
+ this.errorCode=ErrorCode.UNLOGIN.getCode();
+
+ }
+
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(int errorCode) {
+ this.errorCode = errorCode;
+ }
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/JurisdictionMapper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/JurisdictionMapper.java
new file mode 100644
index 0000000..d9a7102
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/JurisdictionMapper.java
@@ -0,0 +1,36 @@
+package com.example.demo.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import com.example.demo.entity.Jurisdiction;
+
+public interface JurisdictionMapper {
+
+ @Select("select * from Jurisdiction")
+ public List selectAllPermission();
+
+
+ @Insert("insert into jurisdiction(permission,description) value(#{permission},#{description})")
+ @Options(useGeneratedKeys=true,keyColumn="id",keyProperty="id")
+ public void addOne(Jurisdiction jurisdiction);
+
+ @Delete("delete from jurisdiction where id=#{id}")
+ public boolean deleteOne(int id);
+
+ @Update("update jurisdiction set permission=#{permission},description = #{description} where id=#{id}")
+ public boolean update(Jurisdiction jurisdiction);
+
+ //查找某角色所有权限
+ @Select("SELECT b.* FROM RoleJurisdictionRelation a INNER JOIN jurisdiction b ON a.j_id = b.id WHERE a.r_id =#{id}")
+ public List selectByRoleId(int id);
+
+ //查找某用户所有权限
+ @Select("SELECT c.* FROM UserRoleRelation a INNER JOIN RoleJurisdictionRelation b ON a.r_id = b.r_id INNER JOIN Jurisdiction c ON b.j_id = c.id WHERE a.u_id =#{id}")
+ public List selectByUserId(int id);
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleJurisdictionMapper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleJurisdictionMapper.java
new file mode 100644
index 0000000..35271e4
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleJurisdictionMapper.java
@@ -0,0 +1,12 @@
+package com.example.demo.mapper;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+
+public interface RoleJurisdictionMapper {
+ @Delete("delete from roleJurisdictionRelation where r_id=#{id}")
+ public void deleteByRoleId(int id);
+
+ @Insert("insert into roleJurisdictionRelation(r_id,j_id) value(#{roleId},#{jId})")
+ public void insert(int roleId,int jId);
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleMapper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleMapper.java
new file mode 100644
index 0000000..80ab5ae
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/RoleMapper.java
@@ -0,0 +1,30 @@
+package com.example.demo.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import com.example.demo.entity.Role;
+
+public interface RoleMapper {
+
+ @Select("select * from role")
+ public List selectAllRole();
+
+ @Select("SELECT b.* from UserRoleRelation a INNER JOIN Role b on a.r_id = b.id where a.u_id = #{userId}")
+ public List selectByUserId(int userId);
+
+ @Insert("insert into role(name) value(#{name})")
+ @Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")
+ public void addOne(Role role);
+
+ @Delete("delete from role where id=#{id}")
+ public boolean deleteOne(int id);
+
+ @Update("update role set name=#{name} where id=#{id}")
+ public boolean updateName(int id, String name);
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserMapper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserMapper.java
new file mode 100644
index 0000000..9f02b30
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserMapper.java
@@ -0,0 +1,34 @@
+package com.example.demo.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import com.example.demo.entity.User;
+
+public interface UserMapper {
+ //新增用户
+ @Insert("insert into user(name,age,password) value(#{name},#{age},#{password})")
+ @Options(useGeneratedKeys=true,keyColumn="id",keyProperty="id")
+ public void insert(User user);
+
+ //查找所有用户
+ @Select("select * from user")
+ public List getAll();
+
+ //根据id查找用户
+ @Select("select * from user where id=#{id}")
+ public User getById(int id);
+
+ @Update("update user set name=#{name},age=#{age},password=#{password} where id=#{id}")
+ public boolean update(User user);
+
+ //根据id删除用户
+ @Delete("delete from user where id=#{id}")
+ public boolean deleteById(int id);
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserRoleMapper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserRoleMapper.java
new file mode 100644
index 0000000..8583938
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/mapper/UserRoleMapper.java
@@ -0,0 +1,16 @@
+package com.example.demo.mapper;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+
+public interface UserRoleMapper {
+ @Delete("delete from userRoleRelation where u_id=#{id}")
+ public void deleteByUserId(int id);
+
+ @Insert("insert into userRoleRelation(u_id,r_id) value(#{userId},#{roleId})")
+ public void insert(int userId,int roleId);
+
+ //根据角色名给用户分配角色
+ @Insert("insert into userrolerelation select #{userId},id from role where name=#{roleName}")
+ public void insertByRoleName(int userId,String roleName);
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAccessDeniedHandler.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAccessDeniedHandler.java
new file mode 100644
index 0000000..c10a95e
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAccessDeniedHandler.java
@@ -0,0 +1,38 @@
+package com.example.demo.security;
+
+import com.example.demo.error.ErrorCode;
+import com.example.demo.util.JsonHelper;
+import com.example.demo.util.Reply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component("myAccessDeniedHandler")
+public class MyAccessDeniedHandler implements AccessDeniedHandler{
+
+ @Autowired
+ private JsonHelper jsonHelper;
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Override
+ public void handle(HttpServletRequest request, HttpServletResponse response,
+ AccessDeniedException accessDeniedException) throws IOException, ServletException {
+
+ log.info("吴操作权限:{}",accessDeniedException.getMessage());
+ response.setContentType("application/json;charset=UTF-8");
+ ErrorCode code = ErrorCode.NO_PERMISSION;
+ response.getWriter().write(jsonHelper.toJson(new Reply(code.getCode(),code.getMess())));
+
+ }
+
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthFailedHandle.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthFailedHandle.java
new file mode 100644
index 0000000..e7b579c
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthFailedHandle.java
@@ -0,0 +1,32 @@
+package com.example.demo.security;
+
+import com.example.demo.error.ErrorCode;
+import com.example.demo.util.JsonHelper;
+import com.example.demo.util.Reply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component("myAuthFailedHandle")
+public class MyAuthFailedHandle extends SimpleUrlAuthenticationFailureHandler{
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private JsonHelper jsonHelper;
+
+ @Override
+ public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException exception) throws IOException, ServletException {
+ response.setContentType("application/json;charset=UTF-8");
+ ErrorCode code = ErrorCode.WRONG_LOGIN_INFO;
+ response.getWriter().write(jsonHelper.toJson(new Reply(code.getCode(),code.getMess()+"asdf")));
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthSuccessHandle.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthSuccessHandle.java
new file mode 100644
index 0000000..b0d0e11
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthSuccessHandle.java
@@ -0,0 +1,37 @@
+package com.example.demo.security;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import com.example.demo.util.JsonHelper;
+import com.example.demo.util.Reply;
+
+@Component("myAuthSuccessHandle")
+public class MyAuthSuccessHandle implements AuthenticationSuccessHandler{
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private JsonHelper jsonHelper;
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
+ Authentication authentication) throws IOException, ServletException {
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(jsonHelper.toJson(new Reply("登录成功")));
+ }
+
+
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthenticationEntryPoint.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthenticationEntryPoint.java
new file mode 100644
index 0000000..9ab11c5
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyAuthenticationEntryPoint.java
@@ -0,0 +1,41 @@
+package com.example.demo.security;
+
+import com.example.demo.error.ErrorCode;
+import com.example.demo.util.JsonHelper;
+import com.example.demo.util.Reply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:未登录直接返回401,不进行302跳转
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-18
+ */
+@Component
+public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+ @Autowired
+ private JsonHelper jsonHelper;
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Override
+ public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
+ log.info("未登录:{}",authException.getMessage() );
+ ErrorCode code=ErrorCode.UNLOGIN;
+ authException.printStackTrace();
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(jsonHelper.toJson(new Reply(code.getCode(),code.getMess())));
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyLogoutSuccessHandle.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyLogoutSuccessHandle.java
new file mode 100644
index 0000000..fa3e4db
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyLogoutSuccessHandle.java
@@ -0,0 +1,34 @@
+package com.example.demo.security;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import com.example.demo.util.JsonHelper;
+import com.example.demo.util.Reply;
+
+@Component("myLogoutSuccessHandle")
+public class MyLogoutSuccessHandle implements LogoutSuccessHandler{
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private JsonHelper jsonHelper;
+
+ @Override
+ public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
+ throws IOException, ServletException {
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(jsonHelper.toJson(new Reply("登出成功")));
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyPasswordEncoder.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyPasswordEncoder.java
new file mode 100644
index 0000000..355bacc
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyPasswordEncoder.java
@@ -0,0 +1,30 @@
+package com.example.demo.security;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+import com.example.demo.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fxb 实现PasswordEncoder接口,自定义加密算法,自定义密码判断
+ *
+ */
+@Component
+public class MyPasswordEncoder implements PasswordEncoder {
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Override
+ public String encode(CharSequence rawPassword) {
+ return rawPassword.toString();
+ }
+
+ //密码是否匹配
+ @Override
+ public boolean matches(CharSequence rawPassword, String encodedPassword) {
+ String encodeStr = StringUtil.StringToMD5(rawPassword.toString());
+ log.info("raw:{},encoded:{}", rawPassword.toString(), encodedPassword);
+ return encodedPassword.equals(encodeStr);
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyUsernamePasswordAuthentication.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyUsernamePasswordAuthentication.java
new file mode 100644
index 0000000..d6ab607
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/MyUsernamePasswordAuthentication.java
@@ -0,0 +1,32 @@
+package com.example.demo.security;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class MyUsernamePasswordAuthentication extends UsernamePasswordAuthenticationFilter{
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Override
+ public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
+ throws AuthenticationException {
+ //验证失败抛出错误
+ log.info("在这里进行验证码判断");
+ return super.attemptAuthentication(request, response);
+ }
+
+ @Autowired
+ @Override
+ public void setAuthenticationManager(AuthenticationManager authenticationManager) {
+ // TODO Auto-generated method stub
+ super.setAuthenticationManager(authenticationManager);
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/SecurityConfig.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/SecurityConfig.java
new file mode 100644
index 0000000..31dd15f
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/SecurityConfig.java
@@ -0,0 +1,141 @@
+package com.example.demo.security;
+
+import com.example.demo.security.authentication.MyFilterSecurityInterceptor;
+import com.example.demo.service.SecurityUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+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.web.access.intercept.FilterSecurityInterceptor;
+import org.springframework.security.web.authentication.RememberMeServices;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
+import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices;
+
+import javax.sql.DataSource;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private MyAuthFailedHandle myAuthFailedHandle;
+ @Autowired
+ private MyAuthSuccessHandle myAuthSuccessHandle;
+ @Autowired
+ private MyAccessDeniedHandler myAccessDeniedHandler;
+ @Autowired
+ private MyLogoutSuccessHandle myLogoutSuccessHandle;
+ @Autowired
+ private AuthenticationManagerBuilder authenticationManagerBuilder;
+ @Autowired
+ private MyAuthenticationEntryPoint myAuthenticationEntryPoint;
+ @Autowired
+ private MyFilterSecurityInterceptor urlFilterSecurityInterceptor;
+ @Autowired
+ private SecurityUserService securityUserService;
+ @Autowired
+ private MyPasswordEncoder myPasswordEncoder;
+ @Autowired
+ DataSource dataSource;
+
+ @Bean
+ public AuthenticationManager authenticationManager() throws Exception {
+ return this.authenticationManagerBuilder.build();
+ }
+
+ @Bean
+ public MyUsernamePasswordAuthentication myUsernamePasswordAuthentication(){
+ MyUsernamePasswordAuthentication myUsernamePasswordAuthentication = new MyUsernamePasswordAuthentication();
+ //设置登录成功处理,登录失败处理
+ myUsernamePasswordAuthentication.setAuthenticationFailureHandler(myAuthFailedHandle);
+ myUsernamePasswordAuthentication.setAuthenticationSuccessHandler(myAuthSuccessHandle);
+ myUsernamePasswordAuthentication.setFilterProcessesUrl("/public/login");
+ myUsernamePasswordAuthentication.setRememberMeServices(rememberMeServices());
+ myUsernamePasswordAuthentication.setUsernameParameter("id");
+ myUsernamePasswordAuthentication.setPasswordParameter("password");
+ return myUsernamePasswordAuthentication;
+ }
+
+// @Bean
+// public UrlFilterSecurityInterceptor urlFilterSecurityInterceptor(){
+// UrlFilterSecurityInterceptor urlFilterSecurityInterceptor = new UrlFilterSecurityInterceptor();
+// urlFilterSecurityInterceptor.setSecurityMetadataSource(mySecurityMetadataSource);
+// urlFilterSecurityInterceptor.setAccessDecisionManager(myAccessDecisionManager);
+// return urlFilterSecurityInterceptor;
+// }
+
+
+
+ //设置登录
+ @Override
+ @Autowired
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ auth.userDetailsService(securityUserService)
+ .passwordEncoder(myPasswordEncoder);
+// auth.eraseCredentials(false);
+ }
+
+ @Bean
+ public RememberMeServices rememberMeServices(){
+ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
+ jdbcTokenRepository.setDataSource(dataSource);
+ PersistentTokenBasedRememberMeServices rememberMeServices =
+ new PersistentTokenBasedRememberMeServices("INTERNAL_SECRET_KEY",securityUserService,jdbcTokenRepository);
+// rememberMeServices.setCookieName("heiyou");
+ return rememberMeServices;
+ }
+
+
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.sessionManagement().maximumSessions(1).expiredUrl("/public/unlogin");
+ http
+ .csrf() //跨站
+ .disable() //关闭跨站检测
+ //自定义鉴权过程,无需下面设置
+// .authorizeRequests()//验证策略
+// .antMatchers("/public/**").permitAll()//无需验证路径
+// .antMatchers("/user/**").permitAll()
+// .antMatchers("/login").permitAll()//放行登录
+// .antMatchers(HttpMethod.GET, "/user").hasAuthority("getAllUser")//拥有权限才可访问
+// .antMatchers(HttpMethod.GET, "/user").hasAnyAuthority("1","2")//拥有任一权限即可访问
+ //角色类似,hasRole(),hasAnyRole()
+// .anyRequest().authenticated()
+// .and()
+ .exceptionHandling()
+ .authenticationEntryPoint(myAuthenticationEntryPoint)//未登录处理
+ .accessDeniedHandler(myAccessDeniedHandler)//权限不足处理
+ .and()
+ .addFilterBefore(myUsernamePasswordAuthentication(),UsernamePasswordAuthenticationFilter.class)
+ .addFilterBefore(urlFilterSecurityInterceptor,FilterSecurityInterceptor.class)
+ .rememberMe()//默认放在内存中
+ .rememberMeServices(rememberMeServices())
+ .key("INTERNAL_SECRET_KEY")
+// 重写usernamepasswordauthenticationFilter后,下面的设置失效
+// .and()
+// .formLogin()
+// .loginPage("/public/unlogin") //未登录跳转页面,设置了authenticationentrypoint后无需设置未登录跳转页面
+// .loginProcessingUrl("/public/login")//登录api
+// .successForwardUrl("/success")
+// .failureForwardUrl("/failed")
+// .usernameParameter("id")
+// .passwordParameter("password")
+// .failureHandler(myAuthFailedHandle) //登录失败处理
+// .successHandler(myAuthSuccessHandle)//登录成功处理
+// .usernameParameter("id")
+ .and()
+ .logout()//自定义登出
+ .logoutUrl("/public/logout")
+// .logoutSuccessUrl("public/logoutSuccess")
+ .logoutSuccessHandler(myLogoutSuccessHandle);
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyAccessDecisionManager.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyAccessDecisionManager.java
new file mode 100644
index 0000000..d00a395
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyAccessDecisionManager.java
@@ -0,0 +1,56 @@
+package com.example.demo.security.authentication;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.AccessDecisionManager;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.authentication.AuthenticationTrustResolver;
+import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
+import org.springframework.security.authentication.InsufficientAuthenticationException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+@Component
+public class MyAccessDecisionManager implements AccessDecisionManager{
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+ private AuthenticationTrustResolver authenticationTrustResolver = new AuthenticationTrustResolverImpl();
+
+ @Override
+ public void decide(Authentication authentication, Object object, Collection configAttributes)
+ throws AccessDeniedException, InsufficientAuthenticationException {
+ //无需验证放行
+ if(configAttributes==null || configAttributes.size()==0)
+ return;
+ log.info("开始验证");
+// if(!authentication.isAuthenticated()){
+ if(authenticationTrustResolver.isAnonymous(authentication)){
+ throw new InsufficientAuthenticationException("未登录");
+ }
+ Collection extends GrantedAuthority> authorities = authentication.getAuthorities();
+ for(ConfigAttribute attribute : configAttributes){
+ if(!(attribute instanceof MyConfigAttribute)) continue;
+ MyConfigAttribute urlConfigAttribute = (MyConfigAttribute)attribute;
+ for(GrantedAuthority authority: authorities){
+ if(!(authority instanceof MyGrantedAuthority)) continue;
+ MyGrantedAuthority myGrantedAuthority = (MyGrantedAuthority)authority;
+ if(urlConfigAttribute.getMyGrantedAuthority().equals(myGrantedAuthority))
+ return;
+ }
+ }
+ throw new AccessDeniedException("无权限");
+ }
+
+ @Override
+ public boolean supports(ConfigAttribute attribute) {
+ return true;
+ }
+
+ @Override
+ public boolean supports(Class> clazz) {
+ return true;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyConfigAttribute.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyConfigAttribute.java
new file mode 100644
index 0000000..864de28
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyConfigAttribute.java
@@ -0,0 +1,39 @@
+package com.example.demo.security.authentication;
+
+import org.springframework.security.access.ConfigAttribute;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:自定义ConfigAttribute实现
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-19
+ */
+public class MyConfigAttribute implements ConfigAttribute {
+ private HttpServletRequest httpServletRequest;
+ private MyGrantedAuthority myGrantedAuthority;
+
+ public MyConfigAttribute(HttpServletRequest httpServletRequest) {
+ this.httpServletRequest = httpServletRequest;
+ }
+
+ public MyConfigAttribute(HttpServletRequest httpServletRequest, MyGrantedAuthority myGrantedAuthority) {
+ this.httpServletRequest = httpServletRequest;
+ this.myGrantedAuthority = myGrantedAuthority;
+ }
+
+ public HttpServletRequest getHttpServletRequest() {
+ return httpServletRequest;
+ }
+
+ @Override
+ public String getAttribute() {
+ return myGrantedAuthority.getUrl();
+ }
+
+ public MyGrantedAuthority getMyGrantedAuthority() {
+ return myGrantedAuthority;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyFilterSecurityInterceptor.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyFilterSecurityInterceptor.java
new file mode 100644
index 0000000..00ba831
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyFilterSecurityInterceptor.java
@@ -0,0 +1,64 @@
+package com.example.demo.security.authentication;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.SecurityMetadataSource;
+import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
+import org.springframework.security.access.intercept.InterceptorStatusToken;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import java.io.IOException;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-19
+ */
+@Component
+public class MyFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
+
+ @Autowired
+ private MySecurityMetadataSource mySecurityMetadataSource;
+
+ @Autowired
+ public void setMyAccessDecisionManager(MyAccessDecisionManager myAccessDecisionManager) {
+ super.setAccessDecisionManager(myAccessDecisionManager);
+ }
+
+ @Override
+ public void init(FilterConfig arg0) throws ServletException {
+ }
+
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ FilterInvocation fi = new FilterInvocation(request, response, chain);
+ invoke(fi);
+ }
+
+ public void invoke(FilterInvocation fi) throws IOException, ServletException {
+ InterceptorStatusToken token = super.beforeInvocation(fi);
+ try {
+ fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
+ } finally {
+ super.afterInvocation(token, null);
+ }
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+ @Override
+ public Class> getSecureObjectClass() {
+ return FilterInvocation.class;
+ }
+
+ @Override
+ public SecurityMetadataSource obtainSecurityMetadataSource() {
+ return this.mySecurityMetadataSource;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyGrantedAuthority.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyGrantedAuthority.java
new file mode 100644
index 0000000..7efd72e
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MyGrantedAuthority.java
@@ -0,0 +1,55 @@
+package com.example.demo.security.authentication;
+
+import org.springframework.security.core.GrantedAuthority;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:自定义权限类
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-19
+ */
+public class MyGrantedAuthority implements GrantedAuthority {
+ private String method;
+ private String url;
+
+ public MyGrantedAuthority(String method, String url) {
+ this.method = method;
+ this.url = url;
+ }
+
+ @Override
+ public String getAuthority() {
+ return url;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this==obj) return true;
+ if(obj==null||getClass()!= obj.getClass()) return false;
+ MyGrantedAuthority grantedAuthority = (MyGrantedAuthority)obj;
+ if(this.method.equals(grantedAuthority.getMethod())&&this.url.equals(grantedAuthority.getUrl()))
+ return true;
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = this.method!=null?this.method.hashCode():0;
+ result=33*result+(this.url!=null?this.url.hashCode():0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return this.method+" : "+this.url;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MySecurityMetadataSource.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MySecurityMetadataSource.java
new file mode 100644
index 0000000..88b2d86
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/security/authentication/MySecurityMetadataSource.java
@@ -0,0 +1,65 @@
+package com.example.demo.security.authentication;
+
+import com.example.demo.entity.Jurisdiction;
+import com.example.demo.mapper.JurisdictionMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-19
+ */
+@Component
+public class MySecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ private JurisdictionMapper jurisdictionMapper;
+ private List jurisdictions;
+
+ private void loadResource() {
+ log.info("get all jurisdiction");
+ this.jurisdictions = jurisdictionMapper.selectAllPermission();
+ }
+
+
+ @Override
+ public Collection getAttributes(Object object) throws IllegalArgumentException {
+ if (jurisdictions == null) this.loadResource();
+ HttpServletRequest request = ((FilterInvocation) object).getRequest();
+ Set allConfigAttribute = new HashSet<>();
+ AntPathRequestMatcher matcher;
+ for (Jurisdiction jurisdiction : jurisdictions) {
+ matcher = new AntPathRequestMatcher(jurisdiction.getUrl(), jurisdiction.getMethod());
+ if (matcher.matches(request)) {
+ ConfigAttribute configAttribute = new MyConfigAttribute(request,new MyGrantedAuthority(jurisdiction.getMethod(),jurisdiction.getUrl()));
+ allConfigAttribute.add(configAttribute);
+ return allConfigAttribute;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Collection getAllConfigAttributes() {
+ return null;
+ }
+
+ @Override
+ public boolean supports(Class> clazz) {
+ return FilterInvocation.class.isAssignableFrom(clazz);
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/SecurityUserService.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/SecurityUserService.java
new file mode 100644
index 0000000..8d6207b
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/SecurityUserService.java
@@ -0,0 +1,57 @@
+package com.example.demo.service;
+
+import com.example.demo.entity.Jurisdiction;
+import com.example.demo.entity.User;
+import com.example.demo.mapper.JurisdictionMapper;
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.security.authentication.MyGrantedAuthority;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: ${fxb}
+ * Email: fanxb.tl@gmail.com
+ * Date: 2018-07-20
+ */
+@Component
+public class SecurityUserService implements UserDetailsService {
+ @Autowired
+ private JurisdictionMapper jurisdictionMapper;
+ @Autowired
+ private UserMapper userMapper;
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ log.info("登录用户id为:{}",username);
+ int id = Integer.valueOf(username);
+ User user = userMapper.getById(id);
+ if(user==null) {
+ log.info("登录用户id不存在:{}",username);
+ throw new UsernameNotFoundException("用户名 "+username+"不存在");
+ }
+ //获取用户权限
+ List authorities = new ArrayList<>();
+ List jurisdictions = jurisdictionMapper.selectByUserId(id);
+ for(Jurisdiction item : jurisdictions) {
+// GrantedAuthority authority = new SimpleGrantedAuthority(item.getPermission());
+ GrantedAuthority authority = new MyGrantedAuthority(item.getMethod(),item.getUrl());
+ authorities.add(authority);
+ }
+ user.setAuthorities(authorities);
+ log.info("获取用户{}信息成功,权限为:{}",username,authorities);
+ return user;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/UserService.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/UserService.java
new file mode 100644
index 0000000..bc52ca9
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/service/UserService.java
@@ -0,0 +1,66 @@
+package com.example.demo.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.example.demo.security.authentication.MyGrantedAuthority;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import com.example.demo.entity.Jurisdiction;
+import com.example.demo.entity.User;
+import com.example.demo.mapper.JurisdictionMapper;
+import com.example.demo.mapper.RoleMapper;
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.mapper.UserRoleMapper;
+import com.example.demo.util.StringUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class UserService {
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private JurisdictionMapper jurisdictionMapper;
+ @Autowired
+ private UserRoleMapper userRoleMapper;
+
+ private Logger log = LoggerFactory.getLogger(this.getClass());
+
+ //默认分配guest角色
+ public void register(User user) {
+ user.setPassword(StringUtil.StringToMD5(user.getPassword()));
+ log.info(user.toString());
+ userMapper.insert(user);
+ userRoleMapper.insertByRoleName(user.getId(), "guest");
+ }
+
+ //获取所有用户
+ public List getAll(){
+ return userMapper.getAll();
+ }
+
+ public User getOne(int id){
+ User user = userMapper.getById(id);
+ return user;
+ }
+
+ //插入用户
+ @Transactional
+ public void insert(){
+ User user = new User(100,"123456","fxb",(short)12);
+ userMapper.insert(user);
+ user.setAge((short)1000);
+ userMapper.insert(user);
+ log.info("插入用户完毕");
+ }
+
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/JsonHelper.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/JsonHelper.java
new file mode 100644
index 0000000..27c7585
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/JsonHelper.java
@@ -0,0 +1,40 @@
+package com.example.demo.util;
+
+import java.io.IOException;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Component
+public class JsonHelper {
+ private ObjectMapper mapper;
+
+ public JsonHelper() {
+ mapper = new ObjectMapper();
+// mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ public JsonHelper(JsonInclude.Include include) {
+ mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(include);
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ public String toJson(Object object) throws JsonProcessingException {
+ return mapper.writeValueAsString(object);
+ }
+
+ public T fromJson(String json, Class cls) throws Exception{
+ return mapper.readValue(json, cls);
+ }
+
+ public T fromJson(String json, @SuppressWarnings("rawtypes") TypeReference valueTypeRef) throws IOException {
+ return mapper.readValue(json, valueTypeRef);
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/Reply.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/Reply.java
new file mode 100644
index 0000000..eaf74d2
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/Reply.java
@@ -0,0 +1,74 @@
+package com.example.demo.util;
+
+import com.example.demo.error.ErrorCode;
+
+public class Reply {
+ private int status;
+ private String info;
+ private Object data;
+
+ public Reply() {
+ System.out.println("reply默认构造函数");
+ ErrorCode OK = ErrorCode.OK;
+ this.status = OK.getCode();
+ this.info = OK.getMess();
+ }
+
+ public Reply(int status, String info, Object data) {
+ super();
+ this.status = status;
+ this.info = info;
+ this.data = data;
+ }
+
+ public Reply(int status, String info) {
+ this.status = status;
+ this.info = info;
+ }
+
+ public Reply(int status) {
+ this.status = status;
+ this.info = "";
+ }
+
+ public Reply(String info) {
+ this.status = ErrorCode.OK.getCode();
+ this.info = info;
+ }
+
+ public Reply(String info, Object o) {
+ this.status = ErrorCode.OK.getCode();
+ this.info = info;
+ this.data = o;
+ }
+
+ public Reply(Object o) {
+ this.status = ErrorCode.OK.getCode();
+ this.info = ErrorCode.OK.getMess();
+ this.data = o;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getInfo() {
+ return info;
+ }
+
+ public void setInfo(String info) {
+ this.info = info;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/StringUtil.java b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/StringUtil.java
new file mode 100644
index 0000000..39e2b40
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/java/com/example/demo/util/StringUtil.java
@@ -0,0 +1,39 @@
+package com.example.demo.util;
+
+import java.security.MessageDigest;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class StringUtil {
+ private static final String hexDigIts[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
+ "e", "f" };
+
+ public static String StringToMD5(String str) {
+ String result = null;
+ try {
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ result = byteArrayToHexString(md5.digest(str.getBytes()));
+ } catch (Exception e) {
+ }
+ return result;
+ }
+
+ public static String byteArrayToHexString(byte b[]) {
+ StringBuffer resultSb = new StringBuffer();
+ for (int i = 0; i < b.length; i++) {
+ resultSb.append(byteToHexString(b[i]));
+ }
+ return resultSb.toString();
+ }
+
+ public static String byteToHexString(byte b) {
+ int n = b;
+ if (n < 0) {
+ n += 256;
+ }
+ int d1 = n / 16;
+ int d2 = n % 16;
+ return hexDigIts[d1] + hexDigIts[d2];
+ }
+}
diff --git a/springboot_spirngsecurity_demo/src/main/resources/application.yml b/springboot_spirngsecurity_demo/src/main/resources/application.yml
new file mode 100644
index 0000000..2899ea3
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/main/resources/application.yml
@@ -0,0 +1,14 @@
+mybatis:
+ type-aliases-package: com.example.demo.entity
+server:
+ port: 8081
+spring:
+ datasource:
+ driver-class-name: com.mysql.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
+ username: root
+ password: 123456
+ http:
+ encoding:
+ charset: utf-8
+ enabled: true
diff --git a/springboot_spirngsecurity_demo/src/test/java/com/example/demo/SpringbootSpirngsecurityDemoApplicationTests.java b/springboot_spirngsecurity_demo/src/test/java/com/example/demo/SpringbootSpirngsecurityDemoApplicationTests.java
new file mode 100644
index 0000000..e4a0d08
--- /dev/null
+++ b/springboot_spirngsecurity_demo/src/test/java/com/example/demo/SpringbootSpirngsecurityDemoApplicationTests.java
@@ -0,0 +1,16 @@
+package com.example.demo;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SpringbootSpirngsecurityDemoApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}