shiro配置

来源:互联网 发布:防网络尖兵方法 编辑:程序博客网 时间:2024/05/19 14:39

在spring的配置文件的写法:

  1. <!--************************请求权限的设置********************-->
  2. <!--realm配置,realm是shiro的桥梁,它主要是用来判断subject是否可以登录及权限等 自己写的类主要是判断用户角色权限继承AuthorizingRealm-->
  3. <bean id="siteRealm" class="com.sanhai.nep.managerService.filter.SiteRealmManager">
  4. </bean>
  5. <!--securityManager是shiro的核心,初始化时协调各个模块运行-->
  6. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  7. <property name="realm" ref="siteRealm"/>
  8. </bean>
  9. <!-- 自定义的角色过滤器 继承AuthorizationFilter-->
  10. <bean id="anyRoles" class="com.sanhai.nep.managerService.filter.CustomRolesAuthorizationFilter"/>
  11. <!--shiro过滤器配置,bean的id值须与web中的filter-name的值相同-->
  12. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  13. <property name="securityManager" ref="securityManager"/>
  14. <!-- 没有权限或者失败后跳转的页面 -->
  15. <property name="unauthorizedUrl" value="/views/common/unauthorized.html"/>
  16. <property name="loginUrl" value="/views/common/login.jsp"/>
  17. <property name="filterChainDefinitions">
  18. <value>
  19. /appRoute=authc,anyRoles[role]
  20. /appAPI=authc,anyRoles[role]
  21. </value>
  22. </property>
  23. </bean>
  24. <!-- 用户授权信息Cache -->
  25. <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"/>
  26. <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  27. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  28. <!-- AOP式方法级权限检查 -->
  29. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
  30. depends-on="lifecycleBeanPostProcessor">
  31. <property name="proxyTargetClass" value="true"/>
  32. </bean>
  33. <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  34. <property name="securityManager" ref="securityManager"/>
  35. </bean>
  36. <!--************************shir********************-->

其中过滤的关键字含义:

  • anon:例子/admins/**=anon 没有参数,表示可以匿名使用。
  • authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数
  • roles:例子/admins/user/=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
  • port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal。

自定义角色过滤器的类:

  1. package com.sanhai.nep.managerService.filter;
  2. import org.apache.shiro.subject.Subject;
  3. import org.apache.shiro.web.filter.authz.AuthorizationFilter;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import javax.servlet.http.HttpServletRequest;
  7. public class CustomRolesAuthorizationFilter extends AuthorizationFilter {
  8. @Override
  9. protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {
  10. Subject subject = getSubject(req, resp);
  11. String[] rolesArray = (String[]) mappedValue;
  12. HttpServletRequest request = (HttpServletRequest) req;
  13. StringBuffer url = request.getRequestURL();
  14. request.getSession().setAttribute("url", url);//把当前的请求的url放在session里面,在SiteRealmManager中判断使用
  15. if (rolesArray == null || rolesArray.length == 0) { //没有角色限制,有权限访问
  16. return true;
  17. }
  18. for (int i = 0; i < rolesArray.length; i++) {
  19. if (subject.hasRole(rolesArray[i])) { //若当前用户是rolesArray中的任何一个,则有权限访问
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. }

realm配置,realm是shiro的桥梁,它主要是用来判断subject是否可以登录及权限等

  1. package com.sanhai.nep.managerService.filter;
  2. import com.sanhai.common.util.Contants;
  3. import com.sanhai.nep.managerService.entity.MenuEntity;
  4. import org.apache.log4j.Logger;
  5. import org.apache.shiro.SecurityUtils;
  6. import org.apache.shiro.authc.*;
  7. import org.apache.shiro.authz.AuthorizationInfo;
  8. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  9. import org.apache.shiro.realm.AuthorizingRealm;
  10. import org.apache.shiro.session.Session;
  11. import org.apache.shiro.subject.PrincipalCollection;
  12. import org.apache.shiro.subject.Subject;
  13. import java.util.ArrayList;
  14. import java.util.HashSet;
  15. import java.util.List;
  16. import java.util.Set;
  17. /**
  18. * Created by 胥源博 on 2016/7/12.
  19. */
  20. public class SiteRealmManager extends AuthorizingRealm {
  21. private Logger logger = Logger.getLogger(this.getClass());
  22. @Override
  23. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  24. Subject currentUser = SecurityUtils.getSubject();
  25. String roleName = "unRole";//默认没有权限
  26. if (null != currentUser) {
  27. Session session = currentUser.getSession();
  28. //获取用户的所有的权限
  29. List list = (List) session.getAttribute("menuList");
  30. List<MenuEntity> chList = new ArrayList();
  31. //获取当前访问的url
  32. StringBuffer url = (StringBuffer) session.getAttribute("url");
  33. //遍历url看看用户有没有权限
  34. K:
  35. if (list != null && list.size() > 0) {
  36. for (int i = 0; i < list.size(); i++) {
  37. MenuEntity menuEntity = (MenuEntity) list.get(i);
  38. //当有二级菜单权限的时候
  39. if (menuEntity.getChildMenu() != null && menuEntity.getChildMenu().size() != 0) {
  40. //获取当前一级菜单下面的所有二级菜单权限
  41. chList = menuEntity.getChildMenu();
  42. //遍历当前菜单下的所有二级菜单权限
  43. for (int j = 0; j < chList.size(); j++) {
  44. MenuEntity menuEntity_ = chList.get(j);
  45. //判断能不能匹配上 当匹配上的时候说明用户具有权限跳出所有的循环判断
  46. if (url.toString().indexOf(menuEntity_.getUri()) != -1) {
  47. roleName = "role";
  48. break K;
  49. }
  50. }
  51. }
  52. //当匹配上的时候说明用户具有权限跳出所有的循环判断
  53. if (menuEntity.getUri() != null && !"".equals(menuEntity.getUri())) {
  54. if (menuEntity.getUri().indexOf(url.toString()) != -1) {
  55. roleName = "role";
  56. break K;
  57. }
  58. }
  59. }
  60. }
  61. // //查询用户流水例外
  62. // if (url.toString().indexOf("itemizedAccount") != -1) {
  63. // roleName = "role";
  64. // }
  65. }
  66. Set<String> roleNames = new HashSet<String>();
  67. Set<String> permissions = new HashSet<String>();
  68. roleNames.add(roleName);//添加角色
  69. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
  70. info.setStringPermissions(permissions);
  71. return info;
  72. }
  73. @Override
  74. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
  75. Subject currentUser = SecurityUtils.getSubject();
  76. String accout = null;
  77. if (null != currentUser) {
  78. Session session = currentUser.getSession();
  79. accout = (String) session.getAttribute(Contants.SESSION_KEY_ACCOUNT);//从session中取得用户名
  80. }
  81. UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
  82. if (token.getUsername().equals(accout)) {
  83. return new SimpleAuthenticationInfo(accout, token.getPassword(), getName());
  84. } else {
  85. throw new AuthenticationException();
  86. }
  87. }
  88. }

依赖包:

  1. <!-- Apache Shiro -->
  2. <!-- 核心包 -->
  3. <dependency>
  4. <groupId>org.apache.shiro</groupId>
  5. <artifactId>shiro-core</artifactId>
  6. <version>1.2.1</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.shiro</groupId>
  10. <artifactId>shiro-web</artifactId>
  11. <version>1.2.1</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.shiro</groupId>
  15. <artifactId>shiro-ehcache</artifactId>
  16. <version>1.2.1</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.shiro</groupId>
  20. <artifactId>shiro-spring</artifactId>
  21. <version>1.2.1</version>
  22. </dependency>
原创粉丝点击