shiro
一、环境搭建
1、创建一个普通的maven项目,引入shiro的pom依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
2、引入shiro配置文件shiro.ini
,并加入以下配置
# 约定写法
[users]
# 用户名=密码
christy=123456
tide=654321
shiro的配置文件是一个.ini文件,类似于.txt文件
.ini文件经常用作某些软件的特定的配置文件,可以支持一些复杂的数据格式,shiro可以按照内部约定的某种格式读取配置文件中的数据
之所以提供这个配置文件是用来学习shiro时书写我们系统中相关的权限数据,从而减轻配置数据库并从数据库读取数据的压力,降低学习成本,提高学习效率
二、测试实例
1、初始化获取securityManager
//IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager=factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
2、获取当前用户的subject对象
Subject currentUser=SecurityUtils.getSubject();
3、通过当前用户拿到session
Session session=currentUser.getSession();
4、判断当前用户是否被认证
1f(! currentuser . 1SAuthenticated() ) {
//Token : 令牌
UsernamePasswordToken token = new UsernamePasswordToken( username:"lonestanr" ,password: "vespa" );
token.setRememberMe(true); /设置记住我
}
5、核心方法
currentUser.getPrincipal();
currentUser.hasRole("schwartz")
currentUser.isPeritted("lightsaber:wield")
currentUser.logout();
三、集成springboot项目整合shiro
subject 用户
Securitymanager 管理所有用户
realm 连接数据
shiro常见过滤器
配置缩写 | 对应过滤器 | 功能 |
---|---|---|
anno | AnonymousFilter | 无需认证就可以访问 |
authc | FormAuthenticationFilter | 必须认证了才能访问 |
role | RolesAuthorizationFilter | 拥有某个角色权限才能访问 |
user | UserFilter | 必须拥有记住我功能才能访问 |
perms | PermissionsAuthorizationFilter | 拥有对某个资源的权限才能访问 |
(1)编写配置类ShiroConfig
@Configuration
public class ShiroConfig{
//3、 ShiroFilterFactoryBean
public ShiroFilterFactoryBean getShinroFilterFactoryBean(@Qqualifier("securityNanager")DefaultwebSecuritylanager defaultwebSecuritylanager)){
ShiroFilterFactoryBean bshiroFilterFactoryBeanean = new ShiroFilterFactoryBean();
//设置安全管理器
bean. setSecurityManager(defaultwebSecurityManager);
//添加shiro的内置过滤器
//配置系统受限资源
//配置系统公共资源
Map<String,String> map = new HashMap<String,String>();
map.put("/index.jsp","authc");//authc 请求这个资源需要认证和授权
//默认认证界面路径(shiro没有默认登录页面,需要自己写)
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
//2、DafaultwebSecurityManager
@Bean( name="securityManager")
public DefaultwebSecuritylanager getDefaultNebSecuritywanager(@Qualifier("userRealm")UserRealm userRealm){
DefaultwebSecurityManager securityManager = new DefaultwebSecurityManager();
/关联userReaLm
securityManager.setRealm(userRealm);
return securityManager;
}
//1、创建realm 对象,需要自定义类
@Bean
public UserRealm userRealm(){
return new UserRealm( );
}
}
(2)自定义userRealm
//自定义的UserReaLm extends AuthorizingReaLm
public class UserRealm extends AuthorizingRealm {
/授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("执行了=>授权doGetAuthorizationInfo" );
return null;
}
I
//认证
Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationExceptiopn{
System.out.println("执行了=>认证doGetAuthorizationInfo");
return nu11;
}
(3)controller层
@RequestMapping("login")
public String login(String username,String password){
// 获取当前登录用户
Subject subject = SecurityUtils.getSubject();
//封装用户的登录数据
UsernamePasswordToken token=new UsernamePasswordToken(username,password);
try {
// 执行登录操作
subject.login(new UsernamePasswordToken(username,password));
// 认证通过后直接跳转到index.jsp
return "redirect:/index.jsp";
} catch (UnknownAccountException e) {//用户名不存在
e.printStackTrace();
System.out.println("用户名错误~");
} catch (IncorrectCredentialsException e) {//密码不存在
e.printStackTrace();
System.out.println("密码错误~");
} catch (Exception e) {
e.printStackTrace();
}
// 如果认证失败仍然回到登录页面
return "redirect:/login.jsp";
}