org.apache.shiro
shiro-spring
1.6.0
配置Shiro
@Configuration
public class ShiroConfig {
//Shiro三大核心
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean= new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
// 添加shiro的内置过滤器
// anon 无需认证就可以访问
// authc 认证才可以访问
// user 记住我功能
// perms 拥有对某个资源的权限才可以访问
// role拥有某哥角色才可以访问
Map filterMap=new linkedHashMap<>();
filterMap.put("/user/add","authc");//增加一个访问限制
bean.setFilterChainDefinitionMap(filterMap);
return bean;
}
//创建realm对象 ,自定义 1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//ShiroFilterFactoryBean
@Bean
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
重写认证和授权两个方法
public class UserRealm extends AuthorizingRealm {
@Override
//授权
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("授权");
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("认证");
return null;
}
我们发现当进入没有权限的界面时会走一个login,所以我们得写一个login
自定义登录
账号:
密码:
Configuration配置
bean.setLoginUrl("/toLogin");//跳转到登录界面
Controller
@RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
实现用户认证
首先我们先写一个表单提交的Controller
@RequestMapping("/login")
public String login(String username,String password,Model model){
//获取当前的用户
Subject subject = SecurityUtils.getSubject();
//封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);//执行登录方法,没有异常就说明登录oko
return "index";
}catch (UnknownAccountException e){//账号错误
model.addAttribute("msg","用户名错误");
return "login";
}catch (IncorrectCredentialsException e){//密码错误
model.addAttribute("msg","密码错误");
return "login";
}
}
在认证中判断
System.out.println("认证");
// 获取当前的用户账号密码
String username="admin";
String password="123456";
//转换成封装着用户信息的token
UsernamePasswordToken user= (UsernamePasswordToken) authenticationToken;
if (!user.getUsername().equals(username)){
return null;//null说明没有抛出异常
}
//密码认证 shiro自动判别
return new SimpleAuthenticationInfo("",password,"");
}
演示
整合mybatis实现从数据库中查找
环境整合
com.alibaba
druid
1.1.21
log4j
log4j
1.2.17
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
org.projectlombok
lombok
1.18.22
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
换成从数据库中读取数据
System.out.println("认证");
// 获取当前的用户账号密码
//连接真实数据库
//转换成封装着用户信息的token
UsernamePasswordToken user= (UsernamePasswordToken) authenticationToken;
User RealUser = userService.queryUserByName(user.getUsername());
if (RealUser==null){
return null;
}
//如果数据库中有这个人直接获取这个人的密码然后和前端进行比对
return new SimpleAuthenticationInfo("",RealUser.getPassword(),"");
}
请求授权实现
从数据库中获取身份
相关代码
@Configuration
public class ShiroConfig {
//Shiro三大核心
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
// 设置安全管理器
// 添加shiro的内置过滤器
// anon 无需认证就可以访问
// authc 认证才可以访问
// user 记住我功能
// perms 拥有对某个资源的权限才可以访问
// role拥有某哥角色才可以访问
ShiroFilterFactoryBean bean= new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
Map filterMap=new linkedHashMap<>();
//授权操作 perms 身份满足才可以进相应的界面
filterMap.put("/user/add","perms[user:add]");//
filterMap.put("/user/update","perms[user:update]");
filterMap.put("/user/*","authc");//增加一个访问限制访问add时需要进行登录认证
bean.setFilterChainDefinitionMap(filterMap);
bean.setLoginUrl("/toLogin");//跳转到登录界面
//未授权的请求
bean.setUnauthorizedUrl("/noauth");
return bean;
}
//创建realm对象 ,自定义 1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//ShiroFilterFactoryBean
@Bean
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
授权于认证方法
public class UserRealm extends AuthorizingRealm {
@Autowired
UserServiceImpl userService;
@Override
//授权
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("授权");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 将授权写死
// info.addStringPermission("user:add");
// 从数据库中获取身份
Subject subject = SecurityUtils.getSubject();
User CurrentUser = (User) subject.getPrincipal();
//设置当前用户权限
info.addStringPermission(CurrentUser.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("认证");
// 获取当前的用户账号密码
//连接真实数据库
//转换成封装着用户信息的token
UsernamePasswordToken user= (UsernamePasswordToken) authenticationToken;
User RealUser = userService.queryUserByName(user.getUsername());
if (RealUser==null){
return null;
}
//如果数据库中有这个人直接获取这个人的密码然后和前端进行比对
return new SimpleAuthenticationInfo(RealUser,RealUser.getPassword(),"");
}
}
整合Thyme leaf注销
com.github.theborakompanioni
thymeleaf-extras-shiro
2.0.0
完成配置
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
导入命名空间
保存session在认证中
// 将查询的用户放到session中
Subject CurrentSubject = SecurityUtils.getSubject();
Session session = CurrentSubject.getSession();
session.setAttribute("user",RealUser);



