在shiro整合mybatis实现认证功能 在此篇文章的基础上实现授权的功能:对网页的访问设置权限,只有登录的用户具有该网页的访问权限才能够访问此网页,那篇文章已经将系统的环境全都配好了,只需要在完善功能即可,所以关于项目的环境在这里就不进行过多的介绍了。
数据库添加一个新的属性,用以作为用户的权限
关于静态资源,还是之前使用的那几个网页:四个网页
设置网页访问权限
package com.springboot_shiro.Myconfig;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
//isAuthenticated:用于判断用户是否已经进行登录
@Configuration
public class config1 {
//定义认证流程过程中需要的程序
// shiroFilterFactoryBean组件可以实现指定网页的拦截,并为文件的访问设置权限
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager FactoryBean){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(FactoryBean);
//拦截请求
Map<String,String> map = new LinkedHashMap<>();
//权限设置:当访问/add这个网页要先进行登录
// map.put("/add","authc");
//访问/update则不需要进行任何操作,直接可以进行访问
// map.put("/update","anon");
//访问add网页需要拥有add权限
map.put("/add","perms[user:add]");
//访问update网页需要拥有update权限
map.put("/update","perms[user:update]");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
//访问需要进行认证的网页,如果没有进行登录则进行网页的跳转
shiroFilterFactoryBean.setLoginUrl("/tologin");
shiroFilterFactoryBean.setUnauthorizedUrl("/noauthor");
return shiroFilterFactoryBean;
}
//对内部的组件进行管理
@Bean
public DefaultWebSecurityManager securityManager(@Qualifier("realm") Realm realm){
DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager();
SecurityManager.setRealm(realm);
return SecurityManager;
}
//用户验证的桥梁,实现用户的认证信息的确认
@Bean
public Realm realm(){
return new Realm();
}
}
在域名设置,添加这样的一个域名
@RequestMapping("/noauthor")
@ResponseBody
public String noauthor(){
return "此网页未经进行授权"; //当用户登录时,没有权限则返回下面的语句
}
运行项目看看能不能访问这两个网页
阶段性测试成功
接下来要实现的时,获取数据库信息中的权限值,并将获取的权限值,赋给登录的用户
在Realm这个组件进行授权内容的设置
package com.springboot_shiro.Myconfig;
import com.springboot_shiro.pojo.user;
import com.springboot_shiro.service.userService;
import org.apache.shiro.SecurityUtils;
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.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
public class Realm extends AuthorizingRealm {
@Autowired
com.springboot_shiro.service.userService userService;
//授权内容则是在这个接口进行配置
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了授权");
//设置来到此页面的用户给他添加一个权限 add
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
//获取当前用户的信息:数据源为下面认证时SimpleAuthenticationInfo类传递过来的
Subject subject = SecurityUtils.getSubject();
user principal = (user)subject.getPrincipal();
//将获取权限值,赋给此时登录的用户
authorizationInfo.addStringPermission(principal.getPerm());
return authorizationInfo;
}
//验证则是在这个接口进行配置
//获取subject传递来的参数加密的令牌Token,进行认证
//AuthenticationInfo是一个接口:return它的的实现类
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
UsernamePasswordToken token =(UsernamePasswordToken) Token; //转换
user user = userService.queryUser(token.getUsername());
System.out.println(token.getUsername());
if (user==null){
return null;
}
//密码的验证,在spring boot架构中给一个类SimpleAuthenticationInfo可以自动化进行认证
return new SimpleAuthenticationInfo(user,user.getPassword(),""); //第一个参数user则是进行传递,可以让其他功能能够获取到,从数据库得到的数据
}
}
代码设置完成:运行项目
权限设置demo1可以访问add网页。demo3可以访问update网页 demo2没有设置权限,哪个网页都不能进行访问
测试登录demo1用户
能够访问add网页
访问update用户则没有权限
demo1用户设置成功
测试登录demo2用户
访问add网页没有没有权限
访问update网页没有权限
测试登录demo3用户
访问add用户没有权限
访问update网页成功
基础的认证功能实现完成,