治疗技术焦虑的方法就是学习!

Spring Boot学习笔记[5]-REST API使用Spring Security+OAuth2做权限控制

Spring Boot 李新广 21516℃ 0评论

前面有一篇文章Spring+Spring Security+OAuth2实现REST API权限控制,讲了Spring+Spring Security+OAuth2来实现REST API权限控制,出于快速实现的原因,里面的用户信息和认证token都是保存在内存中。这样并不符合实际项目场景。所以,这篇文章就是讲述如何从数据库中加载用户信息,并且将认证token保存在redis中。
源码地址:https://github.com/li5454yong/springboot-security-oauth2.git
首先来看项目结构

这个项目中用到了三张表,运行项目会自动在数据库建立这三张表。

1、pom依赖

相对于Spring的集成,这里去除了Spring的依赖,引入了Spring Boot的依赖、Spring data JPA依赖、redis依赖。

2、自定义UserDetailService

这里只需要实现UserDetailsService接口,实现loadUserByUsername方法,通过用户名来获取到用户的信息。如果用户不存在可以抛出UsernameNotFoundException。然后通过userid来获取用户角色。因为一个用户可能会拥有多个角色,所以这里返回的是一个List。最后返回的是一个org.springframework.security.core.userdetails.User对象,里面包含了用户名、密码、角色。也可以根据自己需要去设置用户是否被锁定、是否可用等信息。

3、Security配置

只要在这里面实例化MyUserDetailService,然后通过AuthenticationManagerBuilderuserDetailsService方法,设置进去就OK了。passwordEncoder方法设置的是用户密码的加密方式,这里设置的是MD5加密,所以用户从前端登录时传过来的密码,在使用Security验证时会自动使用MD5加密。

4、redis配置

Spring Boot中集成Redis非常简单,只需要引入spring-boot-starter-redis依赖包,然后配置上链接信息就行了,Spring Boot的约束优于配置比起Spring着实方便不少。不知道Spring如何集成Redis的这里有一个集成的Demo,可以拿去参考一下。https://github.com/li5454yong/spring-redis.git

5、RedisTokenStore配置

TokenStore默认有四种实现,我们这里使用的是RedisTokenStore,他的构造方法中需要一个redis链接工厂。我们直接将Spring容器管理的redisConnectionFactory注入进来即可。

6、测试

这里的测试和Spring集成的测试方法一样,这里就不在赘述,不明白的可以参考上一篇文章。

7、踩坑

2017-09-09更新
一些朋友在使用demo时遇到几个问题,发现有一些地方没说清楚,这里更新一下。

1、密码加密问题

代码中已经配置了密码使用MD5加密,所以使用demo时,插入到数据库的密码要使用MD5加密一样。
如果你想使用其他的方式加密也是可以的,spring security提供了一下几种加密

2、测试接口访问时提示没有权限。
Spring Security默认的角色前缀是”ROLE_”,使用hasRole方法时已经默认加上了,因此我们在数据库里面的用户角色应该是“ROLE_user”,在user前面加上”ROLE_”前缀

转载请注明:大道至简 » Spring Boot学习笔记[5]-REST API使用Spring Security+OAuth2做权限控制

喜欢 (28)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(10)个小伙伴在吐槽
  1. “这里的测试和Spring集成的测试方法一样,这里就不在赘述,不明白的可以参考上一篇文章。“ 可是我用了上一篇的,POSTMAN里面返回"error_description": "Bad credentials",希望能指导下!
    阿毛2017-09-09 12:19 回复
    • 请问你是怎么测试的
      企鹅23爱的2018-04-16 22:38 回复
    • 吧MD5加密 注释掉
      企鹅23爱的2018-04-19 10:01 回复
  2. 如果还有resource,role_resource两张表,应该怎么设计和处理
    蚂蚁2017-09-10 12:36 回复
  3. 我用1.5.2版本 返回 没权限 { "timestamp": 1507711748071, "status": 401, "error": "Unauthorized", "message": "Full authentication is required to access this resource", "path": "/oauth/token" } 求教怎么处理
    小熊怪2017-10-11 16:58 回复
  4. 你好,看了代码有如下几个问题: 问题1:我没看到代码里有自动创建user,role和user_role三个表的语句呢? 问题2:使用http://localhost:1130/oauth/token?grant_type=password&username=bob&password=abc123后,POSTMAN里返回{"error":"invalid_grant","error_description":"Bad credentials"}
    大鱼游得快2017-11-13 17:20 回复
    • 使用的事jpa,这个会自动创建表
      测试2018-05-03 10:31 回复
  5. 您好!我在把您的代码加到我的项目中的时候,在开启spring security 注解这个地方 引起类 spring boot 报 no servlet set 的错误,这里为什么要开启security 的注解?作用是什么呢
    蜡笔小新2018-01-14 23:24 回复
  6. 请问,怎么测试 我按着第四章的方式输入http://localhost:1130/login 弹Whitelabel Error Page页面
    企鹅23爱的2018-04-16 22:17 回复
  7. 您好,初学者问一个问题,获取oauth/token的时候弹出登陆,登陆不进去,数据库链接正常也在表中模拟了数据,通过输出代码,发现没有走loadUserByUsername()方法,为什么会出现这个问题呢?
    Hellow2018-06-05 18:06 回复