Spring Security + JWT token 做权限认证

本文探讨了在Spring Boot应用中使用Spring Security和JWT进行权限认证的方法。介绍了RESTful API认证方式,如Basic Authentication、TOKEN认证(JWT)和OAuth2.0。详细讲解了Spring Security的认证流程,特别是UserDetails的实现,以及如何通过自定义filter进行JWT token的验证。最终实现了登录接口返回JWT token,其他接口需要携带token访问的功能。
摘要由CSDN通过智能技术生成

前言

我的项目是用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拦截器,实现动态过滤用户权

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值