shiro 基礎篇1
- Subject(用戶主體)
- SecurityManager(核心安全管理器,認證授權都要經過該對象,相當於springmvc dispatcher)
- realm(數據庫)
認證過程
shiro常見異常:
realm接口體系
自定義realm
- 一般都會繼承AuthorizingRealm抽象類,因爲該類具備了緩存,認證,授權的方法。
- 自定義realm類繼承AuthorzingRealm
/**
1. 自定義realm
*/
public class MyRealm extends AuthorizingRealm {
//myrealm設置名字
@Override
public void setName(String name) {
super.setName("myrealm");
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//參數 token ; 表示登錄時包裝的UsernamePasswordToken信息
//獲取用戶名
String username = token.getPrincipal().toString();
System.out.println(token);
if(!"zhangsan".equals(username)){
return null;
}
String password= "123456";
//info對象表示realm登錄比對信息; 參數1,用戶信息,餐數2,密碼,參數3,當前reaml名字
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
return info;
}
}
- 自定義realm文件
#自定義realm
myrealm=com.yxt.realm.MyRealm
#指定securityManager的realms實現
securityManager.realms=$myrealm
- 加載配置文件,執行登錄操作
public static void main(String[] args) {
//1.創建用戶數據
String username = "zhangsan";
String password = "123456";
// 2.創建factory工廠,從ini文件拿數據
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:my-shiro.ini");
//3.使用factory創建SecurityManager (有shiro信息)
DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();
//4.將UserRealm注入到完全管理器
/* securityManager.setRealm(new UserRealm2());*/
//5.把當前安全管理器注入到線程中
SecurityUtils.setSecurityManager(securityManager);
//6.獲得主體用戶
Subject subject = SecurityUtils.getSubject();
//7.將用戶名和密碼封裝到token
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
//8.進行登錄
try {
subject.login(token);//進行認證,如果失敗會拋異常
System.out.println("登陸成功");
}catch (IncorrectCredentialsException e){
System.out.println("密碼不正確");
}catch (UnknownAccountException e){
System.out.println("用戶名不存在");
}catch (AuthenticationException e){
System.out.println("用戶名或密碼正確");
}
// 登出
subject.logout();
}