首先第一步引入
<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;
}