前言
我的项目是用SpringBoot 搭建的一个App-Server,用来响应移动端的访问请求,设计的方式是前后端分离的 。本来对权限的做法是在请求里面加上token 字段,然后服务器端再对token做解析,得到userid,再根据userid 查找数据库,来判断当前用户是否有权限访问这个接口。token 是用的JWT;这样做除了每个接口都要写解析token 和 权限的判断代码外,感觉也没有其他问题。
哪位有经验的兄弟能解答一下这样做有什么不妥的地方吗?不甚感激。测试接口和服务端代码如下:
@PostMapping("/test")
@ResponseBody
public BaseResponse test(@RequestBody BaseQueryDataReq req) {
BaseResponse rsp = new BaseResponse();
if(req.getToken() == null || req.getToken().isEmpty())
return ResponseFactory.getErrorResponse(ErrorEnum.ERROR_TOKEN_ERROR);
else if(JwtHelper.isTokenExpiration(req.getToken()))
return ResponseFactory.getErrorResponse(ErrorEnum.ERROR_TOKEN_EXPIRE);
String userid = JwtHelper.getUserIdFromToken(req.getToken());
if(userid == null || userid.isEmpty() || !req.getUserid().equals(userid))
return ResponseFactory.getErrorResponse(ErrorEnum.ERROR_TOKEN_ERROR);
...
...
}
这个方法是参考各大开发者平台的接口定义来的;他们的接口中,大部分都需要在json里面加上一个token字段。但看了Spring Security的一些文章后,觉得不用这个就感觉不正宗一样,所以我也尝试着研究Spring Security。
基础概念
RESTful API认证方式
一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性。
Authentication vs. Authorization
Authentication指的是确定这个用户的身份(用户账号),Authorization是确定该用户拥有什么操作权限,(用户角色role)。
认证方式一般有三种
-
Basic Authentication
这种方式是直接将用户名和密码放到Header中,使用Authorization: Basic Zm9vOmJhcg==
,使用最简单但是最不安全。
- TOKEN认证
这种方式也是再HTTP头中,使用Authorization: Bearer <token>
,使用最广泛的TOKEN是JWT,通过签名过的TOKEN。
- OAuth2.0
这种方式安全等级最高,但是也是最复杂的。如果不是大型API平台或者需要给第三方APP使用的,没必要整这么复杂。
一般项目中的RESTful API使用JWT来做认证就足够了。
spring security认证的实现方式:
实现方式大致可以分为这几种:
1.配置文件实现,只需要在配置文件中指定拦截的url所需要权限、配置userDetailsService指定用户名、密码、对应权限,就可以实现。
2.实现UserDetailsService,loadUserByUsername(String userName)方法,根据userName来实现自己的业务逻辑返回UserDetails的实现类,需要自定义User类实现UserDetails,比较重要的方法是getAuthorities(),用来返回该用户所拥有的权限。
3.通过自定义filter重写spring security拦截器,实现动态过滤用户权