Spring security oauth2最简单入门环境搭建

时间:2021-10-13 22:19:40
关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉。。

友情提示 学习曲线:spring+spring mvc+spring security+Oauth2基本姿势,如果前面都没看过请及时关闭本网页。

我有信心我的这个blog应该是迄今为止使用spring security oauth2最简单的hello world app介绍了,如果你下下来附件源码还看不懂,请留言。。

其他能搜到的如http://blog.csdn.net/monkeyking1987/article/details/16828059这个哥们儿 
和 
http://www.cnblogs.com/smarterplanet/p/4088479.html 
这个,都很好,不过因为依赖了数据库,配置比较多,对于初学者来说,搭起来一个最最简单的环境才是最重要的,撸要一步一步走嘛(如果对spring不是特别熟,强烈不建议看官方的tutorial,槽点太多,例如静态JS库的引用方式,web.xml的使用方式,Spring的配置方式,我反正下下来就惊呆了,第一次看到用java代码配spring)

基本需求: 
用户A希望授权网站B能获取自己在网站appDemo的一个资源,资源的地址是 
http://localhost:8080/appDemo/resource/getUserInfo

使用的框架及版本:

  • spring-webmvc 3.2.8
  • spring-security-web 3.2.6
  • spring-security-oauth2 2.0.7 (这是到2015.7为止的最新版本,和1.0有些小区别,我也在这上面卡了一段时间)

Pom文件见附件整个项目源码。

准备材料(附件都已经包括):

  • 搭建一个springMVC+springSecurity的最简单环境,并且自定义一个login.jsp
  • 写一个controller和Jsp,充当用户的受保护资源
  • 写两个jsp作为scope选择确认页面

我们要做的 
仅仅是配置spring security的配置文件就可以了~一点代码都不用写,数据库也不用连。

我会从client信息开始,把整个配置文件串起来,最后我会讲appDemo使用的方法,和以下的配置联系起来

  • 网站B在网站appDemo的"用户"(注意这里和用户A没半毛钱关系)信息,即client_id和client_secret配置:
  1. <authentication-manager id="clientAuthenticationManager">
  2. <authentication-provider user-service-ref="oauth2ClientDetailsUserService" />
  3. </authentication-manager>
  4. <beans:bean id="oauth2ClientDetailsUserService"
  5. class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
  6. <beans:constructor-arg ref="clientDetailsService" />
  7. </beans:bean>
  8. <oauth2:client-details-service id="clientDetailsService">
  9. <oauth2:client client-id="m1"
  10. authorized-grant-types="password,authorization_code,refresh_token,implicit"
  11. secret="s1" scope="read,write,trust" authorities="ROLE_CLIENT, ROLE_TRUSTED_CLIENT"
  12. resource-ids="pic-resource" />
  13. </oauth2:client-details-service>

注意命名空间,可以看到client配置和spring security传统的用户配置是非常像的。 
这里配置了网站B在appDemo中的client_id,client_secret,scope,权限和授权类型,资源ID,那这个资源ID是个啥呢?

  • 资源filter配置:
  1. <oauth2:resource-server id="picResourceServer"
  2. resource-id="pic-resource" token-services-ref="tokenServices" />

配置这个,除了资源定位(id),还为了给我们的资源加上一个自定义的OAuth过滤器,这个过滤器主要是为了网站B在访问资源的时候验证Access Token。然后出现了两个分支: 
1.配token service 
2.配资源

  • 先讲Token配置:
  1. <beans:bean id="tokenServices"
  2. class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
  3. <beans:property name="tokenStore" ref="tokenStore" />
  4. <beans:property name="supportRefreshToken" value="true" />
  5. <beans:property name="clientDetailsService" ref="clientDetailsService" />
  6. </beans:bean>
  7. <beans:bean id="tokenStore"
  8. class="org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore">
  9. </beans:bean>

我们把Token存在内存里,摆脱数据库依赖。想象一下,为了生成和client相关的token,肯定需要把上面提到的ClientService配置进去

  • 资源和资源的保护
  1. <http pattern="/resource/**" create-session="never"
  2. entry-point-ref="oauth2AuthenticationEntryPoint"
  3. access-decision-manager-ref="oauth2AccessDecisionManager">
  4. <anonymous enabled="false" />
  5. <intercept-url pattern="/resource/**" access="ROLE_USER,SCOPE_READ" />
  6. <custom-filter ref="picResourceServer" before="PRE_AUTH_FILTER" />
  7. <access-denied-handler ref="oauthAccessDeniedHandler" />
  8. </http>

这是spring security的传统配置了,除了我们刚才提到的资源filter,还配置了认证失败、授权失败的处理,和判断是否可访问的"access decision manager"

  • 认证失败,授权失败
  1. <beans:bean id="oauth2AuthenticationEntryPoint"
  2. class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint" />
  3. <beans:bean id="oauthAccessDeniedHandler"
  4. class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />

这个没什么好解释的了,其实作为demo也可以不配,毕竟我们应该会一路按能跑通的先跑。

  • access decision manager
  1. <beans:bean id="oauth2AccessDecisionManager"
  2. class="org.springframework.security.access.vote.UnanimousBased">
  3. <beans:constructor-arg>
  4. <beans:list>
  5. <beans:bean
  6. class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
  7. <beans:bean class="org.springframework.security.access.vote.RoleVoter" />
  8. <beans:bean
  9. class="org.springframework.security.access.vote.AuthenticatedVoter" />
  10. </beans:list>
  11. </beans:constructor-arg>
  12. </beans:bean>

也是传统的配置方法了,多了个oauth2里面特有的scope投票机制。

好,到现在为止,OAuth2 Server所需要的所有龙珠都已经集齐,接下来就可以召唤神龙了

  • 出来吧!神龙
  1. <oauth2:authorization-server
  2. client-details-service-ref="clientDetailsService" token-services-ref="tokenServices"
  3. user-approval-handler-ref="oauthUserApprovalHandler"
  4. user-approval-page="oauth_approval" error-page="oauth_error">
  5. <oauth2:authorization-code />
  6. <oauth2:implicit />
  7. <oauth2:refresh-token />
  8. <oauth2:client-credentials />
  9. <oauth2:password />
  10. </oauth2:authorization-server>
  11. <beans:bean id="oauthUserApprovalHandler"
  12. class="org.springframework.security.oauth2.provider.approval.DefaultUserApprovalHandler" />

还差两步: 
1.网站B来申请Token时候的认证和权限设置:

  1. <http pattern="/oauth/token" create-session="stateless"
  2. authentication-manager-ref="clientAuthenticationManager"
  3. entry-point-ref="oauth2AuthenticationEntryPoint">
  4. <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />
  5. <anonymous enabled="false" />
  6. <http-basic entry-point-ref="oauth2AuthenticationEntryPoint" />
  7. <custom-filter ref="clientCredentialsTokenEndpointFilter"
  8. before="BASIC_AUTH_FILTER" />
  9. <access-denied-handler ref="oauthAccessDeniedHandler" />
  10. </http>
  11. <beans:bean id="clientCredentialsTokenEndpointFilter"
  12. class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
  13. <beans:property name="authenticationManager" ref="clientAuthenticationManager" />
  14. </beans:bean>

2.作为屌丝用户A,认证放在配置最后了(也应该放在前面那个http的后面,因为这里有个全局匹配了)

  1. <http access-denied-page="/login.jsp?error=true"
  2. authentication-manager-ref="authenticationManager">
  3. <intercept-url pattern="/oauth/**" access="ROLE_USER" />
  4. <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
  5. <form-login login-page="/login.jsp"
  6. authentication-failure-url="/login.jsp?error=true"
  7. default-target-url="/index.jsp" />
  8. <anonymous />
  9. </http>
  10. <authentication-manager alias="authenticationManager">
  11. <authentication-provider>
  12. <user-service id="userService">
  13. <user name="admin" password="admin" authorities="ROLE_USER" />
  14. </user-service>
  15. </authentication-provider>
  16. </authentication-manager>

写到这里,我默默预览了一下,估计群众们看到这句话大都是拖滚轴下来的。

不过配置真的挺长,不花篇幅真讲不清楚。

最后把大致流程和配置关联一下:

    • *.用户要授权网站B获取appDemo资源
    • 1.网站B把用户跳转到appDemo/oauth/authorize?client_id=m1&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f&response_type=code&scope=read
      Spring Security Oauth2有一个controller:AuthorizationEndpoint处理这个请求,这个是不用配置的。 但是在controller处理之前,appDemo发现,我擦嘞,用户还没登录啊(见屌丝用户A认证配置)!于是先跳转到登录界面让用户登录。
  • 2.用户登录成功后,跳转到了scope选择确认页面(见出现吧!神龙)。
  • 3.appDemo生成了Authorization Code并跳转回网站B(其实神龙的authorization-code这种配置方式有其他的配置项,可以选填Authorzation code service)
  • 4.网站B拿到了code,向appDemo请求accessToken(appDemo/oauth/token?code=g6hW13&client_id=m1&client_secret=s1&grant_type=authorization_code&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f)
  • 网站B的client认证配置起作用了,AccessDecisionManager起作用了,资源信息起作用了,Token生成也起作用了。

  • 5.最后网站B通过access token访问资源,资源和资源的保护配置起作用了。

具体的使用流程在appDemo的index页面有步骤。

完。

Spring security oauth2最简单入门环境搭建的更多相关文章

  1. 使用Spring Security OAuth2进行简单的单点登录

    1.概述 在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现SSO - 单点登录. 我们将使用三个单独的应用程序: 授权服务器 - 这是*身份验证机 ...

  2. Spring security &plus; oauth2&period;0 &plus; redis &plus; mybatis plus 搭建微服务

    上个星期一个朋友请求帮忙,让我搭建一个分布式授权中心的微服务,之前我也没搭建过,在网上撸了几天前辈们写的技术博客,搞出个模型,分享给大家: 前辈们博客地址: OAuth2.0 原理:https://b ...

  3. spring security oauth2 搭建认证中心demo

    oauth2 介绍 ​ oauth2 协议应该是开发者们耳熟能详的协议了,这里就不做过多的介绍了,具体介绍如何在spring security中搭建oauth2的认证服务.Spring-Securit ...

  4. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...

  5. Spring Security OAuth2&period;0认证授权二:搭建资源服务

    在上一篇文章[Spring Security OAuth2.0认证授权一:框架搭建和认证测试](https://www.cnblogs.com/kuangdaoyizhimei/p/14250374. ...

  6. springboot&plus;spring security &plus;oauth2&period;0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)

    项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖  ...

  7. Re:从零开始的Spring Security Oauth2(一)

    前言 今天来聊聊一个接口对接的场景,A厂家有一套HTTP接口需要提供给B厂家使用,由于是外网环境,所以需要有一套安全机制保障,这个时候oauth2就可以作为一个方案. 关于oauth2,其实是一个规范 ...

  8. Spring Security Oauth2系列(一)

    前言: 关于oauth2,其实是一个规范,本文重点讲解spring对他进行的实现,如果你还不清楚授权服务器,资源服务器,认证授权等基础概念,可以移步理解OAuth 2.0 - 阮一峰,这是一篇对于oa ...

  9. Spring Security OAuth2 Demo -- good

    1. 添加依赖授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency> <groupId>org.springframework ...

随机推荐

  1. Mysql中使用find&lowbar;in&lowbar;set函数查找字符串

    mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...

  2. 关于HTML5在动画制作工具Animatron的一些问题

    Animatron是国外一款在线HTML5动画制作工具,网址:www.animatron.com 当然,想使用的话,是需要FQ的. 用animatron制作好的动画是可以下载为代码和GIF的,这时候付 ...

  3. Longest Palindromic Substring

    题目:https://leetcode.com/problems/longest-palindromic-substring/ 算法分析 这道题的解法有三种:暴力法.动态规划.Manacher算法.三 ...

  4. SharePoint加K2,将Portal系统与BPM系统完美整合!

    K2 blackPearl与Microsoft Office SharePoint 一起为解决人员和流程相互合作的解决方案而提供一个强大的平台. K2“blackpearl”根据企业的需求提供了设计, ...

  5. 几分钟看完 flow&period;ci 全部功能

    从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨.这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化. 这篇文章记录了 flo ...

  6. Javascript之学习笔记每日更新

    1.输出文本 document.write(Date());输出当前时间 2.使用Jacascript改变HTML元素 //定义一个p标签,此p标签带有id元素 <p id="demo ...

  7. cpp常用函数总结

    //sprintf sprintf(temp_str_result, "%lf", temp_double); result = temp_str_result; (*begin) ...

  8. Good Time------打卡让生活更美好

    Section 1团队介绍 Part 1 队员信息 姓名 学号 职务 王怡镔 2016012045 组长 于鑫宇 2016012029 组员 张济吨 2016012072 组员 黄鹤 20160120 ...

  9. mysql数据库表操作-表的主键索引和普通索引

    数据库索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度.查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有 ...

  10. 51nod1683

    代码参考:http://blog.csdn.net/sdfzyhx/article/details/74359927 //dp[i][j][k]表示到了第i列,最下边的点最短路为j,剩下的点之间的关系 ...