# 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`。