shiro_token 学习
shiro 笔记
二、 Shiro 架构原理
必须会。Shiro学习的重中之重。
1 第一行
第一行中示例出了一些语言。无论是什么语言都需要包含Subject
2 Subject
主体。每个用户登录成功后都会对应一个Subject对象,所有用户信息都存放在Subject中。可以理解:Subject就是Shiro提供的用户实体类。
2.1 ShiroUtil
* @Description shiro工具类
*/
public class ShiroUtil {
/**
* @Description 获得shiro的session
* @param
* @return
*/
public static Session getShiroSession() {
return SecurityUtils.getSubject().getSession();
}
/**
* @Description 获得shiro的sessionId
* @param
* @return
*/
public static String getShiroSessionId() {
return getShiroSession().getId().toString();
}
/**
* @Description 是否登陆
* @param
* @return
*/
public static Boolean isAuthenticated(){
Subject subject = SecurityUtils.getSubject();
return subject.isAuthenticated();
}
}
2.2shiroUserUtil
public class ShiroUserUtil extends ShiroUtil{
/**
* @Description 返回当前登录用户封装对象
* @param
* @return
*/
public static ShiroUser getShiroUser() {
//System.out.println(SecurityUtils.getSubject());
if (!EmptyUtil.isNullOrEmpty(ThreadContext.getSubject()) && !EmptyUtil.isNullOrEmpty(SecurityUtils.getSubject().getPrincipal())) {
return (ShiroUser)SecurityUtils.getSubject().getPrincipal();
}else {
return new ShiroUser(SuperConstant.ANON_ID, SuperConstant.ANON_LOGIN_NAME);
}
}
/**
* @Description 获得shiroUserId
* @param
* @return
*/
public static String getShiroUserId() {
ShiroUser shiroUser = ShiroUserUtil.getShiroUser();
if (EmptyUtil.isNullOrEmpty(shiroUser)) {
return null;
}else {
return shiroUser.getId();
}
}
/**
* @Description 更新登录用户信息 用户id 和用户登录名不更新
* @param shiroUser 需要修改对象
* @return
*/
public static void updateShiroUser(ShiroUser shiroUser){
String subjectKey = "org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY";
Subject subject = SecurityUtils.getSubject();
Object ooo = subject.getSession().getAttribute(subjectKey);
SimplePrincipalCollection collection = (SimplePrincipalCollection)ooo;
ShiroUser user = (ShiroUser)collection.getPrimaryPrincipal();
subject.getSession().setAttribute(subjectKey, collection);
}
}
2.3一些方法
SecurityUtils.getSubject().getSession();// 获取session
SecurityUtils.getSubject().getSession().getId().toString(); // 获取sessionID
subject.getPrincipal(); // 获取认证时传递的数据。
subject.login();登陆时传递的参数.
subject.isAuthenticated();
subject.hasRole(parm...);
subject.checkRole(param...);
subject. isPermitted(param..);
subject. checkPermissions(param..);
3.Security Manager
Shiro最大的容器,此容器中包含了Shiro的绝大多数功能。在非Spring Boot项目中,获取Security Manager 是编写代码的第一步。而在Spring Boot中已经帮助我们自动化配置了。
4 Authenticator
认证器。执行认证过程调用的组件。里面包含了认证策略。
5 Authorizer
授权器。执行授权时调用的组件。
6 Session Manager
Shiro被Web集成后,HttpSession对象会由Shiro的Session Manager进行管理。
7 Cache Manager
缓存管理。Shiro执行很多第三方缓存技术。例如:EHCache等。
8 Session DAO
操作Session内容的组件。
9 Realms
Shiro框架实现权限控制不依赖于数据库,通过内置数据也可以实现权限控制。但是目前绝大多数应用的数据都存储在数据库中,所以Shiro提供了Realms组件,此组件的作用就是访问数据库。Shiro内置的访问数据库的代码,通过简单配置就可以访问数据库,也可以自定义Realms实现访问数据库逻辑(绝大多数都这么做)