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

由于项目需要做权限管理的功能,最先想到的是spring security,它是个功能强大的安全管理框架,不过它的复杂性和学习曲线之曲折让人生畏,转而寻求其它解决方案,知道另外一个项目组的人使用shiro做权限管理后就了解了下这个框架,发现比spring security简洁多了,于是就打算使用这个框架,首先嘛,当然是要和现在的系统进行集成,现在系统采用cas来做登录验证,所以先把cas和shiro进行集成。查看shiro官网,发现有个cas模块,下载试用,下面是集成方法,假设你已经搭建好cas服务器。

我是用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.cas.com  
  10. #客户端的回调地址设置,必须和下面的shiro-cas过滤器拦截的地址一致  
  11. casRealm.casService = http://www.example.com/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.youboy.com:8080/cshop/shiro-cas  
  19.   
  20. [urls]  
  21. #设定shiro-cas过滤器拦截的地址  
  22. /shiro-cas = casFilter  
  23. /admin/** = roles[ROLE_USER]  
  24. /** = anon  

这里需要注意的是casRealm.casService设置的回调地址必须和下面casFilter的地址保持一致,否则无法验证成功。更多有关shiro的配置可以参考官方文档

这样如果访问www.example.com/admin/index.html时,如果没登录就会跳到cas去登录,登录成功后跳转回当前页面。

如果想获得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或怎样由你定。

相关推荐