SpringBoot整合Shiro 四:认证+授权
搭建环境见: SpringBoot整合Shiro 一:搭建环境
shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类
shiro整合Mybatis见:SpringBoot整合Shiro 三:整合Mybatis
认证
未授权时
ShiroConfig中添加授权访问
如果用户没有拥有 user:add 就无法访问add页面
filterMap.put("/user/add","perms[user:add]");
如果用户没有拥有 user:update 就无法访问 update 页面
filterMap.put("/user/update","perms[user:update]");
跳转到一个未授权的页面
bean.setUnauthorizedUrl("/noauth");
@Bean(name = "shiroFilterFactoryBean") public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){ ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean(); bean.setSecurityManager(defaultWebSecurityManager); ? Map<String ,String> filterMap = new LinkedHashMap<>(); ? //授权 filterMap.put("/user/add","perms[user:add]"); filterMap.put("/user/update","perms[user:update]"); ? filterMap.put("/user/*","authc"); ? bean.setFilterChainDefinitionMap(filterMap); ? //未授权页面 bean.setUnauthorizedUrl("/noauth"); ? bean.setLoginUrl("/toLogin"); ? return bean; }
Controller中添加未授权页面
使用 @ResponseBody 直接显示字符串
@RequestMapping("/noauth") @ResponseBody public String unauthorized(){ return "未授权无法访问"; }
测试未授权的访问
登录root用户,开始访问2个页面
add
update
授权
数据库添加权限字段
添加 perms(varchar)
对应实体类pojo
使用了Lombok
package com.zy.pojo; ? import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; ? @Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private String pwd; private String perms; ? }
授权操作
UserRealm 中 AuthorizationInfo(授权)
授权的对象 SimpleAuthorizationInfo
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
添加权限的方法 addStringPermission
info.addStringPermission("user:add");
拿到当前登录的对象(认证成功之后,可以获取到)
Subject subject = SecurityUtils.getSubject();
获取到User
User currentUser = (User) subject.getPrincipal();
设置当前用户的权限
info.addStringPermission(currentUser.getPerms());
//授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行了=>授权doGetAuthorizationInfo"); ? SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addStringPermission("user:add"); ? //拿到当前登录的对象 Subject subject = SecurityUtils.getSubject(); //获取到User User currentUser = (User) subject.getPrincipal(); //设置当前用户的权限 info.addStringPermission(currentUser.getPerms()); ? return info; }
测试
root(初始没有权限)
可以访问add页面了,因为被授权了
update仍然不行,因为没有权限
张三(本身有add权限)
可以访问add页面
update不行
王五(本身有update)
add
update
都可以访问了