这节说下 集成权限,这块先讲一下权限控制到角色粒度
总结下步骤先,
1.编辑资源对应的权限控制类,哪些url需要哪些角色才能访问
2.修改realm类中的授权方法
贴代码:
1.编辑资源对应的权限控制类,哪些url需要哪些角色才能访问
package com.ithaha.shiro;
import java.util.LinkedHashMap;
/**
* @author lf
* @Title: FilterChainDefinitionMapBulider
* @Description: 资源权限管理类
* @date 2018/8/24 9:38
*/
public class FilterChainDefinitionMapBulider {
public LinkedHashMap<String,String> buildFilterChainDefinitionMap(){
LinkedHashMap<String ,String> res = new LinkedHashMap<String, String>();
//以下数据都可以通过数据库读取获取
//map中填入的值,,,key:url value:对应url的过滤器
// anon 匿名可以访问(即不用认证就可以)
res.put("/login.jsp","anon");
res.put("/user/login","anon");
//roles 角色拦截器 (authc 认证过)
res.put("/user.jsp","authc,roles[user]");
res.put("/admin.jsp","authc,roles[admin]");
//user 拦截器 认证过 或者 记住我了 就可以访问
res.put("/list.jsp","user");
//permission拦截器
res.put("/permission","perms[user:create]");
//logout 登出拦截器 前端 访问 /user/logout 就可以退出了
res.put("/user/logout","logout");
//authc 表单拦截器需要认证过才可以访问
res.put("/**","authc");
return res;
}
}
2.修改realm类中的授权方法
package com.ithaha.shiro.realms;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import java.util.HashSet;
import java.util.Set;
/**
* @author lf
* @Title: AuthorizationShiroRelam
* @Description: TODO
* @date 2018/7/23 14:11
*/
public class AuthorizationShiroRelam extends AuthorizingRealm {
//授权验证
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取当前登陆对象 用户名
Object principal = principalCollection.getPrimaryPrincipal();
//获取当前登陆用户的角色(可以去数据库中查询)
Set<String> roles = new HashSet<String>();
roles.add("user"); //这里应该可以做到 方法粒度url
if("admin".equals(principal)){
roles.add("admin");
}
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(roles);
//创建返回对象
return authorizationInfo;
}
//认证验证
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
//判断username是否存在
Object hashedCredentials= null; //密码
if("admin".equals(username)){
hashedCredentials = "ce2f6417c7e1d32c1d81a797ee0b499f87c5de06";
}else if("user".equals(username)){
hashedCredentials = "073d4c3ae812935f23cb3f2a71943f49e082a718";
}else{
throw new UnknownAccountException("用户不存在");
}
//设置返回值
Object principal = username;
ByteSource credentialsSalt = ByteSource.Util.bytes(username);
return new SimpleAuthenticationInfo( principal, hashedCredentials, credentialsSalt, getName()) ;
}
}
嗯这样配置一下 ,就好了,我给所有用户都加了user的角色,admin有admin的角色,当某个角色访问自己没有权限访问的页面时,就会自动跳转到配置的未授权的页面
这里在顺带说一下 remember me这个功能,他存在的意义就在于用户登陆之后,选中了记住我,当他关闭浏览器后,在一定时间内 有些页面还是可以访问的,而有些页面是不需要重新登陆才可以访问的,
这个需要几个东西来配合
1.你要设置哪些页面是可以通过remember me来访问的 使用user过滤器
2.在登陆方法中 将remember me设置为true
3.在security Manager 中配置remember 的有效时长
贴一下代码:
1.你要设置哪些页面是可以通过remember me来访问的 使用user过滤器
2.在登陆方法中 将remember me设置为true
3.在security Manager 中配置remember 的有效时长