Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/scienjus/spring-authorization-manager

基于 Spring MVC,提供 API 服务端的身份验证功能。通过 Redis、MySQL 维护登录用户与分配 Token 的映射关系。
https://github.com/scienjus/spring-authorization-manager

Last synced: 3 days ago
JSON representation

基于 Spring MVC,提供 API 服务端的身份验证功能。通过 Redis、MySQL 维护登录用户与分配 Token 的映射关系。

Awesome Lists containing this project

README

        

# Spring Authorization Manager

为Api服务端添加简单的Token鉴权功能,基于Spring MVC

### 功能简述

1. 对每个请求进行身份验证,如果身份验证失败直接返回错误信息(可以自定义错误信息和Http状态码)
2. 通过鉴权信息获得当前登录的用户,并自动注入到Controller的方法中

### 使用方法

仓库:

```

scienjus-mvn-repo
https://raw.github.com/ScienJus/maven/snapshot/

true
always

```

依赖:

```

com.scienjus
spring-authorization-manager
1.0-SNAPSHOT

```

所有依赖库,相信大部分已经存在于你的项目中了:

```


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,或是通过邮件联系我,我的邮箱是:`[email protected]`。

源码分析见我的这篇[博客][1]

一个简单的[Demo][2]

[1]:http://www.scienjus.com/restful-token-authorization/
[2]:https://github.com/ScienJus/spring-authorization-manager-demo/