# spring-authorization-manager **Repository Path**: andy521/spring-authorization-manager ## Basic Information - **Project Name**: spring-authorization-manager - **Description**: Spring Authorization Manager 为Api服务端添加简单的Token鉴权功能,基于Spring MVC 或者SpringBoot功能简述 对每个请求进行身份验证,如果身份验证失败直接返回错误信息(可以自定义错误信息和Http状态码) 通过鉴权信息获得当前登录的用户,并自动注入到Controller的方法中 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-12-10 - **Last Updated**: 2022-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Authorization Manager 为Api服务端添加简单的Token鉴权功能,基于Spring MVC ### 功能简述 1. 对每个请求进行身份验证,如果身份验证失败直接返回错误信息(可以自定义错误信息和Http状态码) 2. 通过鉴权信息获得当前登录的用户,并自动注入到Controller的方法中 ### 使用方法 仓库: ``` ``` 依赖: ``` ``` 所有依赖库,相信大部分已经存在于你的项目中了: ``` com.scienjus spring-authorization-manager 1.0-SNAPSHOT org.springframework spring-webmvc org.springframework spring-context com.fasterxml.jackson.core jackson-core com.fasterxml.jackson.core jackson-databind javax.servlet javax.servlet-api redis.clients jedis mysql mysql-connector-java commons-dbcp commons-dbcp ``` **使用Redis存储Token** 将Jedis客户端注入到`RedisTokenManager`: ``` ``` **使用MySQL存储Token** 只需要将`RedisTokenManager`替换成`MySQLTokenManager`,并将数据源注入进去: ``` ``` **配置身份验证的拦截器** 将配置好的`TokenManager`注入到`AuthorizationInterceptor`中: ``` ``` 接下来只需要对需要身份验证的方法加上`@Authorization`注解即可,例如: ``` @RestController @RequestMapping("/home") public class TokenController { @RequestMapping(method = RequestMethod.GET) @Authorization public ResponseEntity home() { return new ResponseEntity<>("Hello World", HttpStatus.OK); } } ``` 也可以直接在Controller类上加上该注解,这将会使该Controller中的所有方法都需要进行身份验证。 **配置获得当前登录用户的解析器** 首先需要实现`UserModelRepository`接口的`getCurrentUser`方法,可以通过Key得到对应的用户对象,然后配置一个解析器,并将其注入到`CurrentUserMethodArgumentResolver`: ``` ``` 然后只需要在方法的参数上添加一个用户对象,并加上`@CurrentUser`注解,例如: ``` @RestController @RequestMapping("/home") public class TokenController { @RequestMapping(method = RequestMethod.GET) @Authorization public ResponseEntity home(@CurrentUser user) { return new ResponseEntity<>("Hello " + user.getUsername(), HttpStatus.OK); } } ``` 需要注意的是,拥有`@CurrentUser`参数的方法,可以没有`@Authorization`注解,此时如果请求未登录,该参数会为`null`。 但是如果想要使用`CurrentUserMethodArgumentResolver`则必须配置`AuthorizationInterceptor`。 ###更新日志 **2016-3-1** 增加了泛型约束 **2015-11-27** 修改了拦截器的部分代码,内容为: 1. 将返回鉴权失败信息的输出流从`response.getWriter`改为了`response.getOutputStream`,因为`@ResponseBody`默认也是用的后者,便于统一监控返回内容。 2. 可以通过配置文件自定义鉴权失败的http状态码了,默认为401(unauthorized)。 3. 将返回鉴权失败的`Content-Type`设置为`application/json`了,否则可能会导致iOS的网络库`AFNetWorking`解析报错。 ###帮助 如果您在使用中遇到了问题,可以给我提 Issues,或是通过邮件联系我,我的邮箱是:`2415413557@qq.com`。