StringBoot整合Shiro
2017-07-15 本文已影响52人
Chinesszz
首先第一步引入
<!--shiro权限控制框架-->
<dependency> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
添加配置类
-
安全管理器(在管理器中添加自己的验证密码和权限的方法)
@Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; }
-
配置拦截链
拦截链的意思,就是给url赋值权限
/** * ShiroFilterFactoryBean 处理拦截资源文件问题。 * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在 * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager * * Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当设置多个过滤器时,全部验证通过,才视为通过 * 3、部分过滤器可指定参数,如perms,roles * */ @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必须设置 SecurityManager shiroFilterFactoryBean.setSecurityManager(securityManager); // 如果不设置默认会自动寻找Web工程根目录下的"admin登录页面"页面 shiroFilterFactoryBean.setLoginUrl("/admin/login"); // 登录成功后要跳转的链接 shiroFilterFactoryBean.setSuccessUrl("/index"); // 未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 拦截器. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/admin/login", "anon");//登录页面 //TODO 跟登录权限,添加权限test测试。 filterChainDefinitionMap.put("/admin/index", "authc,perms[" +"test" + "]");//校验密码和权限 // 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了 filterChainDefinitionMap.put("/logout", "logout"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
实现Realm
-
doGetAuthenticationInfo
校验密码
/** * 校验用户名和密码 * * @param authcToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { logger.debug("身份认证方法:MyShiroRealm.doGetAuthenticationInfo()"); UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authcToken; //TODO 根据用户名和用户密码判断用户,用户验证成功,就把用户名和用户密码放行 String userName = usernamePasswordToken.getUsername(); Admin user = mongoDao.findOneByQuery(Admin.class, "userName", usernamePasswordToken.getUsername()); String pwd = String.valueOf(usernamePasswordToken.getPassword()); if (ObjectUtils.isEmpty(user)){ throw new IncorrectCredentialsException(); } if (StringUtils.endsWithIgnoreCase(user.getPassword(), pwd)) { return new SimpleAuthenticationInfo(userName, pwd, getName()); } return null; }
-
doGetAuthorizationInfo
在本方法中,查询用户的所有权限,然后添加
/** * 权限链配置 * 在shiro配置类中把资源对应的权限都加载到应用中 * * 在本方法中,查询用户的所有权限,然后添加 * * @param principals * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { logger.debug("##################执行Shiro权限认证##################"); //获取当前登录输入的用户名,等价于 String userName = (String) super.getAvailablePrincipal(principals); logger.debug("##################开始查询用户【" + userName + "】的权限##################"); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //根据每个用户名获得对应的权限列表 //根据用户名获取用户的权限 info.addStringPermission("test"); return info; }