分享

单点登录CAS与权限管理框架Shiro集成

 我心永恒lz 2015-01-29

Shiro集成CAS是在1.2版本里新增的功能。

Shiro-cas模块将应用作为CAS客户端与CAS SSO服务器一起保护web应用。

CAS协议的一个基本理解:

1. 如果你想访问一个被CAS客户端保护的应用,而你还没有进行认证。你讲被重定向到CAS服务端的登录页面。在应用中你需要配置CAS的登录url地址。

http://application./protected/index.jsp → HTTP 302

→ https://server./login?service=http://application./shiro-cas

2. 当你填上登录名和密码在CAS服务端进行认证后,你就被重定向到一个带有服务端票据的应用URL。服务端票据是一次性使用的令牌,可在CAS服务端标识用户的唯一性(或用户属性)。

https://server./login?service=http://application./shiro-cas → HTTP 302

→ http://application./shiro-cas?ticket=ST-4545454542121-cas

3. 应用去CAS服务端询问票据的有效性,CAS服务端响应经过认证的用户唯一标识。CAS客户端将页面转发到受保护的页面。

http://application./shiro-cas?ticket=ST-4545454542121-cas → HTTP 302

→ http://application./protected/index.jsp

如何配置shiroCAS服务器工作?

我是用maven管理项目的,先引入shiro的jar包

[html]
  1. <dependency>  
  2.     <groupId>org.apache.shiro</groupId>  
  3.     <artifactId>shiro-cas</artifactId>  
  4.     <version>1.2.0</version>  
  5. </dependency>  

配置web.xml,添加shiro过滤器

[html]
  1. <filter>  
  2.         <filter-name>shiroFilter</filter-name>  
  3.         <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>configPath</param-name>  
  6.             <param-value>classpath:META-INF/shiro/shiro.ini</param-value>  
  7.         </init-param>  
  8.     </filter>  
  9.       
  10.     <filter-mapping>  
  11.         <filter-name>shiroFilter</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  

其中shiro.ini为shiro配置文件,可以根据具体情况指定其路径。

shiro.ini配置

[plain]
  1. [main]  
  2. casFilter = org.apache.shiro.cas.CasFilter  
  3. #配置验证错误时的失败页面  
  4. casFilter.failureUrl = /error.jsp  
  5.   
  6. #配置casRealm  
  7. casRealm = org.apache.shiro.cas.CasRealm  
  8. casRealm.defaultRoles = ROLE_USER  
  9. casRealm.casServerUrlPrefix = https://www.  
  10. #客户端的回调地址设置,必须和下面的shiro-cas过滤器拦截的地址一致  
  11. casRealm.casService = http://www./shiro-cas  
  12.   
  13. #如果要实现cas的remember me的功能,需要引入下面两个配置  
  14. casSubjectFactory = org.apache.shiro.cas.CasSubjectFactory  
  15. securityManager.subjectFactory = $casSubjectFactory  
  16.   
  17. #设定角色的登录链接,这里为cas登录页面的链接可配置回调地址  
  18. roles.loginUrl = https://www.<span style="color:#000000;">cas</span>.com/login?service=http://shop.:8080/cshop/shiro-cas  
  19.   
  20. [urls]  
  21. #设定shiro-cas过滤器拦截的地址  
  22. /shiro-cas = casFilter  
  23. /admin/** = roles[ROLE_USER]  
  24. /** = anon  

这里需要注意的是casRealm.casService设置的回调地址必须和下面casFilter的地址保持一致,否则无法验证成功。

这样一来,当用户经过CAS服务端的有效票据认证后被重定向到应用的服务地址(/shiro-cas),这个过滤器接收服务端票据并创建一个可以被CasRealm使用的CasToken。CasRealm使用被CasFilter创建的CasToken来验证用户的合法性。

casServerUrlPrefix是CAS服务端地址。

casService是应用服务地址,用来接收CAS服务端票据。

validationProcol值为SAML or CAS,默认是CAS。它依赖于CAS服务器的版本,SAML协议只能使用在CAS server version >= 3.1。

defaultRoles是认证通过后默认角色。

defaultPermissions是认证通过后默认权限。

roleAttributeNames是认证通过的用户的角色属性名称,用逗号分隔。

permissionAttributeNames是认证通过的用户的权限属性名称,用逗号分隔。


如果想获得cas返回的更多用户的信息,比如:用户名,用户id,用户邮箱等,可以添加一个过滤器,这个过滤器必须在shiro的过滤器后面,否则获取不到相关的信息。过滤器代码如下:

[java]
  1. public void doFilter(ServletRequest request, ServletResponse response,  
  2.       FilterChain chain) throws IOException, ServletException {  
  3.       
  4.     PrincipalCollection principalCollection = SecurityUtils.getSubject()  
  5.         .getPrincipals();  
  6.       
  7.     if (principalCollection != null) {        
  8.       List principals = principalCollection.asList();  
  9.       // 这里获取到的list有两个元素,   
  10.       //一个是cas返回来的用户名,举例是aaa,   
  11.       //一个是cas返回的更多属性的map对象,举例是{uid:aaa,username:aaa,email:aaa}   
  12.       //通过principals.get(1)来获得属性集合的map对象   
  13.       Map<String,String> attributes = (Map<String,String>) principals.get(1);  
  14.       if (principals != null) {  
  15.         String email = attributes.get("email");  
  16.         String username = attributes.get("username");  
  17.         String uid = attributes.get("uid");  
  18.         //对获取到的信息进行再处理   
  19.       }  
  20.     }      
  21.     chain.doFilter(request, response);  
  22.   }  

获取到信息就可以把它设置到session或怎样由你定。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多