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

Spring+Spring Security+OAuth2实现REST API权限控制

Spring 李新广 51147℃ 0评论

Spring集成Spring Security、OAuth2实现资源访问授权认证。后端主要做的是认证服务器和资源服务。客户端主要是用前端的js请求。因为只是要做一个demo,所以这里的用户信息和授权token都是保存在内存中,后面会根据项目需要将用户信息保存到数据库,授权信息保存到redis。
源码地址:https://github.com/li5454yong/SpringSecurityOAuth2.git

1、首先来看pom依赖

这里需要注意的是:Spring的版本,如果没有特殊需要的话请保持现在的不变,因为我刚开始是使用的是4.0.0,但是项目启动时回报ClassNotFoundException,说找不到org.springframework.web.filter.CorsFilter这个类,后来查看源码,确实没有这个java类。

2、Spring配置

demo中使用的都是java config风格的配置,没有xml,首先来看Spring的配置。

这里只需要指定注解扫描的包。

配置DispatcherServlet、初始化Spring MVC容器和Spring容器。
可以看到,在这段代码中设置了一下SpringMVC相关的信息,同时还注册了一个拦截器。
下面来看拦截器的代码。

这里和普通web项目中的拦截器并没有什么区别,都是实现了javax.servlet.Filter接口。设置response的header可以解决POST请求跨域的问题。

3、Spring Security配置

在这个配置中,创建了两个用户存储在内存中,指定了token的保存方式为内存存储。

下面,需要开启Spring Security的注解

3、OAuth2配置

首先是认证服务配置

资源服务配置

4、测试

这里使用PostMan来做http测试工具
首先测试获取token
输入url http://localhost:8080/oauth/token?grant_type=password&username=bob&password=abc123

测试获取用户列表,这里在后台对这个方法要求需要拥有“USER”角色
http://localhost:8080/userList/?access_token=a375bb21-f090-4280-ac6a-98323da16e78

OK,里面还有几个URL,感兴趣的话可以自己去测试,另外,demo中也包含了一个使用Http工具来测试的代码。

这篇文章中,用户信息和token都是保存在内存中,我后面还会发文章,使用spring boot来集成,同时把用户信息保存在MySQL中,token保存在redis,这样会更接近与实际项目场景。

转载请注明:大道至简 » Spring+Spring Security+OAuth2实现REST API权限控制

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

表情

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(14)个小伙伴在吐槽
  1. Handling error: InvalidGrantException, Bad credentials
    jacky2017-07-31 15:39 回复
    • 我也没遇到过这个问题,你解决了吗,分享一下
      李新广2017-08-07 19:08 回复
      • 你好 看了你的写的我有几个问题想请教你 能否加下你QQ? 或者你加我下306067416 感谢了
        jerry2017-08-15 12:35 回复
        • 用户密码未加密
          李新广2017-09-09 16:15 回复
    • OAuth2SecurityConfiguration类中 @Autowired public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(myUserDetailsService()); //.passwordEncoder(new Md5PasswordEncoder()); } 记得mark掉注释的这段就可以了
      tr2018-01-09 21:27 回复
  2. Security 单独使用没问题,但是加上oauth2 就不行了。{ "timestamp": 1507943731828, "status": 401, "error": "Unauthorized", "message": "Full authentication is required to access this resource", "path": "/oauth/token" } 同时数据库似乎没有被查询
    tanxw2017-10-14 09:18 回复
  3. 不知道为什么,SpringRestClient里的main方法执行就是404,去掉项目名就是400,端口号和ip都是正确的
    12312017-10-27 09:45 回复
  4. 为什么我的接口加这些权限没有用啊
    junge2017-11-28 20:19 回复
  5. 你好 我down下来您的代码 运行后 请求{ "timestamp": 1512551130953, "status": 401, "error": "Unauthorized", "message": "Bad credentials", "path": "/oauth/token" } 请问下 有遇到这个问题么?
    蚂蚁2017-12-06 17:11 回复
    • 同求,请问你是怎么解决这个问题的呢?
      Hello2018-06-05 20:05 回复
  6. 感谢!!!!让我初步认识了使用权限控制!请问使用这个实现单点登录应该怎么实现呢,感激:-)
    CapriciousYork2018-04-02 14:47 回复
  7. 您好,请问这个在redis中存储的key-value分别是什么?
    CapriciousYork2018-04-02 15:23 回复
  8. 怎么刷新token
    qiangqiang2018-06-05 16:13 回复
  9. 没找到数据库相关的
    达达2019-01-06 10:56 回复