springboot整合shiro(2)整合mybatis-plus+请求授权实现
环境搭建
直接参考
https://www.cnblogs.com/OfflineBoy/p/15148963.html
使用数据库代码来代替伪造数据
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了认证方法");
//连接真实数据库
UsernamePasswordToken usertoken=(UsernamePasswordToken) token;
HashMap<String,Object> map=new HashMap<>();
map.put("name",usertoken.getUsername());
List<User> users = userMapper.selectByMap(map);
if(users.size()==0){
return null;
}
//密码认证 安全问题 只能让shiro做 另外两个参数暂时用不到
return new SimpleAuthenticationInfo("",users.get(0).getPassword(),"");
}
测试即可实现与数据库交互了
请求授权实现
我们为add页面设置一个权限
@Bean
//如果我们在某个注入点需要另一个 bean,我们需要专门指出它。我们可以通过 @Qualifier 注解来做到这一点。
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加过滤器
Map<String, String> filterMap = new LinkedMap();
//perms: 拥有对某个资源的权限才能访问
//设置一个自定义权限字符串 没有权限访问会跳到401页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap);
//设置登录请求
bean.setLoginUrl("/toLogin");
//设置未授权页面
bean.setUnauthorizedUrl("/noauth");
return bean;
}
在控制类响应/noauth路径的请求
@RequestMapping("/noauth")
@ResponseBody
public String unauthorized(){
return "没有权限 无法访问";
}
现在我们登录访问add页面

将无法访问
那么如何进行授权呢?
授权的实现
在数据库上添加权限字段 这里简单代码 我们只考虑只有一种权限的情况

记得实体类添加对应属性
在授权时我们需要获得当前用户对象 那么我们就必须在登录认证时吧数据存进去
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了认证方法");
//连接真实数据库
UsernamePasswordToken usertoken=(UsernamePasswordToken) token;
HashMap<String,Object> map=new HashMap<>();
map.put("name",usertoken.getUsername());
List<User> users = userMapper.selectByMap(map);
if(users.size()==0){
return null;
}
//密码认证 安全问题 只能让shiro做 另外两个参数暂时用不到
//第一个参数将user传递进去 使得授权时可以取出来
return new SimpleAuthenticationInfo(users.get(0),users.get(0).getPassword(),"");
}
之后我们在授权时就可以根据用户对应的权限赋权了
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了授权方法");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Subject subject= SecurityUtils.getSubject();
//获得当前用户
User currentuser = (User) subject.getPrincipal();
//添加权限 名字对应自己设置的字符串
info.addStringPermission(currentuser.getPerms());
//info.addStringPermission("user:add");
return info;
}
到此目的达成

浙公网安备 33010602011771号