基本概念
认证
登陆,身份认证,系统校验一个用户是不是合法用户的过程
最常用的简单身份认证是系统通过核对用户输入的用户名和密码,看其是否与系统中存储的该用户的用户名和密码是否一致,来反4判断用户身份是否正确
相关的概念
subject主体
shiro中最重要的概念就是subject(主体)。subject是一个虚拟的用户对象(封装了用户和登陆相关的属性和方法) login(),loginOut(),getSession()等
认证的流程
controller接收到用户输入的账号密码,封装到subject中,调用subject自己的登陆方法,完成登陆校验(自动查询数据库)
- 导入相关的依赖
- 自定义realm
- 自动装配一个安全管理器
1. DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
2. // 设置realm
3. defaultSecurityManager.setRealm(authenRealm);
4. return defaultSecurityManager; - 通过@Configuration注解来配置过滤器工厂
1. 设置过滤器规则放入map中
2. 调用shiroFilterFactoryBean的setFilterChainDefinitionMap(map)把拦截的规则放入
3. 设置一个安全管理器
案例:
package com.baizhi.config;
import com.baizhi.realm.AuthenRealm;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
/**
* 配置过滤器工厂
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 设置过滤器的规则
// 配置拦截规则 哪些页面拦截 哪些不拦截 过滤器链
Map map = new HashMap();
/**
* anon 代表匿名可访问 就是不用登录就可以访问
*
* authc 代表登录后才能访问
*
* 支持通配符*
*
* 注意拦截规则 一个一个配置
/
map.put("/login.jsp",“anon”);
map.put("/login/",“anon”);
map.put("/main.jsp", "authc");
map.put("/guru/*", "authc");
map.put("/menu/*", "authc");
map.put("/jsp/*", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
// 设置一个安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}
/**
* 创建安全管理器
*
* @Bean 方法的形参 如果对应的类型的对象在工厂中有 会自动装配上
* @return
*/
@Bean
public SecurityManager getSecurityManager(AuthenRealm authenRealm){
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
// 设置realm
defaultSecurityManager.setRealm(authenRealm);
return defaultSecurityManager;
}
/**
* 创建Realm
* @return
*/
@Bean
public AuthenRealm getRealm(){
return new AuthenRealm();
}
}
认证方法:
1. 把凭证信息,和身份信息封装到token中
2. 获取到subject主体
3. 调用该login()方法,把token放进去进行认证
案例:
@RequestMapping(“loginAdmin”)
public String loginAdmin(String username,String password){
// 1.数据封装token
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// 2.获取Subject
Subject subject = SecurityUtils.getSubject();
// 3.调用登录方法
try {
subject.login(token);
return “redirect:/main.jsp”;
}catch (Exception e){
return “redirect:/login.jsp”;
}
}
授权的多种方式
标签式授权
引入标签库<%@taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>
通过标签做标签式授权
注解式授权