思路:创建工厂并读取shiro.ini配置文件,通过工厂创建SecurityManager对象,使用SecurityUtils工具类设置SecurityManager对象,在通过SecurityUtils获取Subject对象,将用户名和密码封装到token,Subject调用login(token)将用户名和密码传给securityManager,securityManager调用realm进行认证和授权。
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
Subject常用方法
Session session = subject.getSession();
session.setAttribute("someKey", "aValue");
String value = (String) session.getAttribute("someKey");
subject.isAuthenticated() 是否登录
subject.login(token) // 执行登录
subject.getPrincipal() // 打印用户名
subject.hasRole("schwartz") //是否有角色
subject.isPermitted("lightsaber:wield") //是否有权限
subject.isPermitted("winnebago:drive:eagle5") //是否更高级权限
subject.logout() // 注销
subject.login()抛出的异常
UnknownAccountException uae // 无此用户
IncorrectCredentialsException ice // 密码和用户名不匹配
LockedAccountException lae // 账户被锁定
AuthenticationException ae // 其他情况
三大对象
Subject:用户/主体/项目
SecurityManager:管理所用用户
Realm:连接数据 ,进行授权和认证(登录)
内置过滤器
onon:无需认证即可访问
outhc:必须认证
user :必须有 记住我 功能才能访问
perms:拥有对某个资源的权限才能访问
role :拥有某个角色权限才能访问
springboot集成:
1.导入jar shiro-spring
2.创建继承于AuthorizingRealm的UserRealm
3.编写配置类重写方法
4.配置类中,编写拦截器
自定义Realm:
继承AuthorizingRealm重写授权和认证方法
获取token
整合thymeleaf
1.导包:thymeleaf-spring5,thymeleaf-extras-java8time
2.配置类添加配置
3.使用