ShiroConfig:
先设置相应权限操作
perms:拥有对某个资源的权限才能访问;
//设置权限,
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
添加一个页面 提示未授权
“未经授权,无法访问页面”
MyController:
@RequestMapping("/noauth")
@ResponseBody
public String unauthorized() {
return "未经授权,无法访问页面";
}
接下来在ShiroConfig:中设置:
//设置未授权要跳转的页面
bean.setUnauthorizedUrl("/noauth");
给数据库添加权限字段,perms
接下来在UserRealm:中给用户授予相应权限
自定义的UserRealm
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了授权 doGetAuthorizationInfo");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//拿到当前登录的这个对象:
Subject subject = SecurityUtils.getSubject();
User currentUser = (User) subject.getPrincipal();//拿到user对象
//给用户添加上相应的权限(来自数据库中的perms字段)
info.addStringPermission(currentUser.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了认证 doGetAuthenticationInfo");
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
//连接真实数据库
User user = userService.queryUserByName(userToken.getUsername());
if (user==null) {
return null;//抛出异常 UnknownAccountException
}
//SimpleAuthenticationInfo:(参数)三个 或者四个
//userInfo, //
// 用户名–此处传的是用户对象 直接通过token.getPrincipal()方法获取—获取当前记录的用户名,从这个用户名获取一系列的对应需求属性。
// 这里传入user 在上面授权中就可以使用
//userInfo.getPassword(), //密码—从数据库中获取的密码
//salt, 盐–用于加密密码对比
//getName() //当前的realm名
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}