原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398
根据下载的pdf学习。
第六章 Realm及相关对象(四)
1.Subject的代码结构
Subject是shiro的核心,基本所有身份验证、授权都是通过Subject完成的。
public interface Subject {
//身份信息获取
Object getPrincipal(); //Primary Principal
PrincipalCollection getPrincipals(); // PrincipalCollection //身份验证
void login(AuthenticationToken token) throws AuthenticationException;
boolean isAuthenticated();
boolean isRemembered(); //角色授权认证
boolean hasRole(String roleIdentifier);
boolean[] hasRoles(List<String> roleIdentifiers);
boolean hasAllRoles(Collection<String> roleIdentifiers);
void checkRole(String roleIdentifier) throws AuthorizationException;
void checkRoles(Collection<String> roleIdentifiers) throws AuthorizationException;
void checkRoles(String... roleIdentifiers) throws AuthorizationException; //权限授权验证
boolean isPermitted(String permission);
boolean isPermitted(Permission permission);
boolean[] isPermitted(String... permissions);
boolean[] isPermitted(List<Permission> permissions);
boolean isPermittedAll(String... permissions);
boolean isPermittedAll(Collection<Permission> permissions);
void checkPermission(String permission) throws AuthorizationException;
void checkPermission(Permission permission) throws AuthorizationException;
void checkPermissions(String... permissions) throws AuthorizationException;
void checkPermissions(Collection<Permission> permissions) throws AuthorizationException; //会话
Session getSession(); //相当于 getSession(true)
Session getSession(boolean create); //退出
void logout(); ....
//其他略
}
还有两个是:RunAs和多线程。代码里省掉了,因为当时我不知道是干嘛的。就打了...
2.Subject的使用
(1)Subject的创建
一般不用自己创建,直接通过SecurityUtils.getSubject() 获取即可。
public static Subject getSubject() {
Subject subject = ThreadContext.getSubject();// 先判定当前线程是否绑定了Subject
if (subject == null) {
subject = (new Subject.Builder()).buildSubject(); //如果没有绑定就通过Builder绑定,并且返回
ThreadContext.bind(subject);
}
return subject;
}
(2)自定义创建Subject
创建完成后,再自己绑定到当前线程即可。
new Subject.Builder().principals(身份).authenticated(true/false).buildSubject();
3.Subject的基本使用
(1)身份验证(login)
(2)授权(hasRole*/isPermitted*或 checkRole*/checkPermission*)
(3)将相应的数据存储到会话(Session)
(4)切换身份(RunAs)/多线程身份传播
(5)退出