spring security oauth2 单点登录

阅读更多

 

本人自己 研究及综合部分网上资料,整理得出,欢迎批评指正,欢迎一起探讨:

 

1.jar版本:

jdk1.6、spring3.1.1、spring-security3.1.0、spring-security-oauth2-1.0.5

 

2.背景:

客户公司 已经存在的N个系统,且每个系统用户名会有不一致情况,用户使用系统时需要多个系统协同操作,弊端凸显。为此,需要一个统一认证中心。

 

3.前提:

3.1:以上N个系统的用户是统一一个出处,如:一个AD域、数据库、LDAP等
3.2:app接入OAuth2的AuthorizationCode方式(其他方式本人未调试过)

3.3:OAuth的5个表已经生成到中心数据库中,并与中心app注册功能整合在一起。 

 

4.定义:

4.1AbstractDomain.java:其中guid默认赋值为uuid,该类覆盖equals、hashCode,guid用户标识用户对象

的创建的唯一性,即同一用户在不同客户端登陆后,用户对象不同。
@Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof AbstractDomain)) {
            return false;
        }
        AbstractDomain that = (AbstractDomain) o;
        return guid.equals(that.guid);
    }

    @Override
    public int hashCode() {
        return guid.hashCode();
    }

4.2用户对象User.java:继承AbstractDomain,是中心的用户对象,也是OAuth接口获取用户信息的bean。

 

 

5.思路:

        使用cookie缓存用户登录信息,app向中心登录时,获取该cookie,同时验证中心的session中是否存在该用户,存在则执行单点登录。
        认证中心为一个CAS服务,同时需要app向中心注册,并提供appCode及redirectUrl,便于OAuth认证时调用。客户端登陆成功后,中心会向客户端浏览器写入cookie,保存登陆用户信息,作为单点登录凭据,用户关闭浏览器时,cookie自动失效。


6.典型场景:

6.1:用户在浏览器上输入app地址,app过滤器验证未登录后,附上appCode,然后发起OAuth第一步认证请求,中心过滤器判断用户是否登录,

 

6.1.1未登录:则会跳转到登陆页面,用户填写用户名密码进行登录,中心获取到登录成功后(向客户端写

入cookie),会继续执行OAuth认证,此时会弹出用户授权页面,当用户点击授权按钮后,转6.1.3

6.1.2已登录:转到授权页面(如果之前已经授权,会继续往下走),转6.1.3


6.1.3中心获取到授权后生成授权码,然后跳转到app的redirectUrl,app获取到授权码,根据授权码继续发送认证第二步请求,以授权码换取token,获取到token后,根据token访问中心提供的用户接口获取用户信息(json),app使用用户信息构建app的session、权限等数据,之后做具体业务操作,认证完成。

 

6.2:用户在该浏览器地址栏再输入app2的地址时,app2也发起OAuth第一步认证,中心仍然跳转到登陆页,此时登陆页获取cookie中用户名与guid信息,自动提交登录信息到action中验证session中是否存在该用户,不存在则调整到登录页面,存在则跳转到app2的redirectUrl,继续向下执行6.1.2操作,以完成认证。


 7.数据流程图:

 spring security oauth2 单点登录_第1张图片

 

 8.代码:纯干货

 8.1web.xml:

 认证中心过滤器,放过一些请求

     
         loginFilter
         *.util.LoginFilter
        
   AllowRes
      
    /login.do;/login.jsp;css;jpg;gif;png;bmp;jpeg;swf;ico;/demo/*;
   /authTypeList.do;/authFail.do; /oauth/authorize;/oauth/token;/oauth/user_info.do;
    isAgainAuth4Client.do
   

  

   

     
         loginFilter
         /*
   

 

 过滤器代理

  
  springSecurityFilterChain
  org.springframework.web.filter.DelegatingFilterProxy
 

 
  springSecurityFilterChain
  /*
 

 

 额外添加spring session监听,用来处理在线用户

 
  org.springframework.security.web.session.HttpSessionEventPublisher
 

 

8.2security.xml配置


             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:oauth2="http://www.springframework.org/schema/security/oauth2"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
                        http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd
                        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">


   
   

              entry-point-ref="oauth2AuthenticationEntryPoint">
       
       
       

       
       
   

   
              access-decision-manager-ref="oauth2AccessDecisionManager">
       

       

       
       
   

   
       
       

                 authentication-failure-url="/ac/login/authFail.do"/>
       
       
       

  

     
   


                    class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
       
   

   
   


   
       
   


   
   
       
   

   
       
       
       
   


   
       
       
   


   
       
   


       user-approval-handler-ref="oauthUserApprovalHandler" user-approval-page="ac/portal/oauth_approval.jsp" error-page="ac/portal/oauth_error.jsp">
       
       
       
       
       
   


   

   
       
   

   
       
   

   
       
           
               
               
               
           

       

   

   


   
       
           
       

   


 
 
  
 

 
 
 
  
  
  
 

 

 

 

说明:

oauth2AccessDeniedHandler:自己编写的类,继承TokenServicesUserApprovalHandler,处理是否需要授权。

CustomJdbcClientDetailsService:自定义类,继承JdbcClientDetailsService,处理认证客户端

oauth_approval.jsp:授权成功页

oauth_error.jsp:授权失败页

acUserDetailsService:继承UserDetailsService,是中心提供的用户API接口

 

 

 

 

 

 

 

 

 

 

  • spring security oauth2 单点登录_第2张图片
  • 大小: 27.6 KB
  • spring security oauth2 单点登录_第3张图片
  • 大小: 57.8 KB
  • security.rar (1.8 KB)
  • 下载次数: 49
  • oauth-sql.rar (449 Bytes)
  • 下载次数: 37
  • 查看图片附件

你可能感兴趣的:(spring,security)