spring security oauth2.0 实现 解决url-pattern .do .action

参考以下两个文章:

http://www.cnblogs.com/0201zcr/p/5328847.html

http://wwwcomy.iteye.com/blog/2230265

web.xml 注意这里的<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>   <url-pattern>/*</url-pattern>  而<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <url-pattern>*.action</url-pattern>会导致org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter构造器里面的/oauth/token被security拦截,而spring mvc却没有拦截

    <!-- SpringSecurity必须的filter start-->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- SpringSecurity必须的filter end-->

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath:applicationContextMvc.xml
            </param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <!--  /oauth/token 是oauth2登陆验证请求的url     用于获取access_token  ,默认的生存时间是43200秒,即12小时-->
    <http pattern="/oauth/token.action" create-session="stateless" authentication-manager-ref="clientAuthenticationManager">
          <intercept-url pattern="/oauth/token.action" access="IS_AUTHENTICATED_FULLY" />      <!--  可以访问的角色名称,如果需要拦截,需要实现UserDetails接口,实现getAuthorities()方法-->
        <anonymous enabled="false" />
        <http-basic entry-point-ref="oauth2AuthenticationEntryPoint" />
        <custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
        <access-denied-handler ref="oauth2AccessDeniedHandler" />
    </http>

这个authentication-manager 是OAUTH的,还需要另一个spring security ,如果已经在使用spring security 那么直需要配置这一个.ClientDetailsUserDetailsService 实现了spring security的UserDetailsService,在ClientDetailsUserDetailsService

的loadUserByUsername并不是验证我们用户的账号密码,验证用户的账号密码在spring security里面已经自己处理了,这里的loadUserByUsername是验证我们的客户端也就是第三方的网址,或者APP,是否有权限访问我们的接口.例如这里我们的第三方APP用户名为mobile_1,密码为secret_1,可以配置多个第三方APP

        <!-- 验证的权限控制 -->
    <authentication-manager id="clientAuthenticationManager">
        <authentication-provider user-service-ref="oauth2ClientDetailsUserService"  />
    </authentication-manager>

    <oauth2:client-details-service id="clientDetailsService" >
        <oauth2:client client-id="mobile_1" authorized-grant-types="password,authorization_code,refresh_token,implicit" secret="secret_1" scope="read,write,trust" authorities="ROLE_CLIENT,ROLE_TRUSTED_CLIENT"  resource-ids="mobile-resource" />
    </oauth2:client-details-service>
    <beans:bean id="oauth2ClientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
        <beans:constructor-arg ref="clientDetailsService" />
    </beans:bean>

spring security 的authentication-manager  , daoAuthenticationProvider需要自己实现,这里就不贴出来了

      <!-- 权限管理者 -->
       <authentication-manager alias="myAuthenticationManager">
               <!-- 权限提供者 -->
               <authentication-provider ref="daoAuthenticationProvider" />
       </authentication-manager>

       <beans:bean id="daoAuthenticationProvider" class="com.thesys.common.security.provider.MyDaoAuthenticationProvider">
              <beans:property name="userDetailsService" ref="securityService" />
              <beans:property name="PasswordEncoder" ref="md5PasswordEncoder" />
        </beans:bean> 

复制org.springframework.security.oauth2.provider.token.DefaultTokenServices 内容新建类MyTokenService  自己重写 private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken)这个方法,实现自己的TOKEN生成方式

              <!-- for spring oauth2 -->
    <!--token在服务器存储的方式    InMemoryTokenStore :保存在内存     ;JdbcTokenStore : 保存在数据库中 -->
    <beans:bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore" />
    <!--<beans:bean id="tokenServices"
        class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">-->     <!--令牌服务的实体-->
    <beans:bean id="tokenServices" class="com.thesys.common.security.oauth.MyTokenService" >
            <beans:property name="tokenStore" ref="tokenStore"></beans:property>
            <beans:property name="supportRefreshToken" value="true"/>
            <beans:property name="clientDetailsService" ref="clientDetailsService" />
    </beans:bean>    <!-- 自己重写的类 -->
                    <!--处理访问成功-->
    <beans:bean id="oauth2AuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint" />
    <!--处理访问拒绝-->
    <beans:bean id="oauth2AccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
    <!--处理认证点-->
    <beans:bean id="oauthUserApprovalHandler" class="org.springframework.security.oauth2.provider.approval.DefaultUserApprovalHandler" />
    <!--处理访问控制-->
    <beans:bean id="oauth2AccessDecisionManager"  class="org.springframework.security.access.vote.UnanimousBased">
        <beans:constructor-arg>
            <beans:list>
                <beans:bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
                <beans:bean class="org.springframework.security.access.vote.RoleVoter" />
                <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </beans:list>
        </beans:constructor-arg>
    </beans:bean>

        <!--oauth2 的server所能支持的请求类型-->
    <oauth2:authorization-server client-details-service-ref="clientDetailsService" token-services-ref="tokenServices" user-approval-handler-ref="oauthUserApprovalHandler">
        <oauth2:authorization-code />
        <oauth2:implicit />
        <oauth2:refresh-token />
        <oauth2:client-credentials />
        <oauth2:password />
    </oauth2:authorization-server>

这里解决.do .action的拦截问题, <beans:constructor-arg value="/oauth/token.action" /> 把默认的/oauth/token 改成/oauth/token.action 就可以解决.do或者.action 的拦截问题

 <beans:bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
        <beans:property name="authenticationManager" ref="clientAuthenticationManager" />
        <beans:constructor-arg value="/oauth/token.action" />
    </beans:bean>  
 <intercept-url pattern="/admin**" access="IS_AUTHENTICATED_FULLY" /> 因为没有项目没有角色的设置,只要登录了就可以访问,所以不设置角色验证
   <!--指定spring要保护的资源,如果没有这个,访问控制的时候会说没有Authentication object:-->
    <oauth2:resource-server id="mobileResourceServer" resource-id="mobile-resource" token-services-ref="tokenServices" />

    <http pattern="/json**" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint" access-decision-manager-ref="oauth2AccessDecisionManager">
        <anonymous enabled="false" />
          <intercept-url pattern="/json**" access="IS_AUTHENTICATED_FULLY" /><!--  -->
        <custom-filter ref="mobileResourceServer" before="PRE_AUTH_FILTER" />
        <access-denied-handler ref="oauth2AccessDeniedHandler" />
    </http>

    <http pattern="/admin**" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint" access-decision-manager-ref="oauth2AccessDecisionManager">
        <anonymous enabled="false" />
          <intercept-url pattern="/admin**" access="IS_AUTHENTICATED_FULLY" /> <!-- -->
        <custom-filter ref="mobileResourceServer" before="PRE_AUTH_FILTER" />
        <access-denied-handler ref="oauth2AccessDeniedHandler" />
    </http>

因为没有设置必须为POST 提交,所以无论GET POST 提交以下请求会返回access_token

http://localhost:8028/oauth/token.action?client_id=mobile_1&client_secret=secret_1&grant_type=password&username=test&password=1
  1. {
  2. "access_token": "6cd40d26561c4ac89e447dd5214c7033",
  3. "token_type": "bearer",
  4. "refresh_token": "459f7555-e733-43c9-8ab8-016b15a61427",
  5. "expires_in": 43199,
  6. "scope": "read trust write"
  7. }

然后带着access_token访问,就可以成功访问

http://localhost:8028/admin.action?access_token=52d33d7d81ee4a388d79bf00387b1325

没有access_token访问的话,会返回

http://localhost:8028/admin.action
  1. <oauth>
  2. <error_description>An Authentication object was not found in the SecurityContext</error_description>
  3. <error>unauthorized</error>
  4. </oauth>
时间: 2024-10-05 14:40:30

spring security oauth2.0 实现 解决url-pattern .do .action的相关文章

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

项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖  下面是我引入的依赖 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q

【OAuth2.0】Spring Security OAuth2.0篇之初识

不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握,或者说先用起来(少年,一辈子辣么长,你这么着急合适吗?).好在前人们已经做好了很好的demo,我自己照着抄一抄也就理解了大概如何用,依旧手残党,依旧敲不出好代码.忏悔- WHAT? 项目之中实际使用OAuth2.0实现是用的Spring Security OAuth2.0,一套基于Spring S

spring security oauth2.0 实现

oauth应该属于security的一部分.关于oauth的的相关知识可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 一.目标 现在很多系统都支持第三方账号密码等登陆我们自己的系统,例如:我们经常会看到,一些系统使用微信账号,微博账号.QQ账号等登陆自己的系统,我们现在就是要模拟这种登陆的方式,很多大的公司已经实现了这种授权登陆的方式,并提供了相应的API,供我们开发人员调用.他们实际上用的也规范是oauth2.0

Spring Security 入门(1-3)Spring Security oauth2.0 指南

入门 这是支持OAuth2.0的用户指南.对于OAuth1.0,一切都是不同的,所以看它的用户指南. 本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部分是OAuth2.0的客户端(OAuth 2.0 Client) OAuth2.0提供端 OAuth2.0的提供端的用途是负责将受保护的资源暴露出去.建立一个可以访问受保护的资源的客户端列表. 提供端是通过管理和验证可用于访问受保护的资源的OAuth 2令牌来做的. 在适当的地方,提供端必须为

OAuth2.0学习(4-99)Spring Security OAuth2.0 开发指南

1.org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter              org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter              org.springframework.security.oauth2.client.fil

OAuth2.0学习(4-1)Spring Security OAuth2.0 - 代码分析

1.org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter              org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter              org.springframework.security.oauth2.client.fil

spring security oAuth2.0 数据库说明

话不多说,直接上代码. 里面每一个字段都有说明,直接将它们放入mysql执行即可添加成功. create table oauth_access_token ( token_id varchar(256) null comment 'MD5加密的access_token的值', token blob null comment 'OAuth2AccessToken.java对象序列化后的二进制数据', authentication_id varchar(256) not null comment '

Spring Security OAuth2 Demo -- good

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

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

关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+spring mvc+spring security+Oauth2基本姿势,如果前面都没看过请及时关闭本网页. 我有信心我的这个blog应该是迄今为止使用spring security oauth2最简单的hello world app介绍了,如果你下下来附件源码还看不懂,请留言.. 其他能搜到的如h