通過shiro學習(1)我們發現僅僅將數據源信息定義在ini文件中與我們實際開發環境有很大不兼容,所以我們希望能夠自定義Realm。
自定義Realm的實現
創建自定義ShiroRealmsOne類
創建一個java文件繼承AuthorizingRealm類,重寫兩個抽象方法
public class ShiroRealmsOne extends AuthorizingRealm{
/**
* 認證
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username =(String)token.getPrincipal();
if(!"admin".equals(username)){
return null;
}
String password = "123456";
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,this.getName());
return info;
}
/**
* 授權
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO 自動生成的方法存根
return null;
}
}
方法名 | 說明 |
doGetAuthenticationInfo | 完成賬號認證的方法 |
doGetAuthorizationInfo | 完成賬號授權的方法 |
配置shiro-realm.ini文件
[main]
shiroUserRealm=com.sumeng.shiro.ShiroRealmsOne
securityManager.realms=$shiroUserRealm
測試
@Test
public void demoTwo(){
// 裝入 INI 配置
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realms.ini");
//創建SecurityManager對象
SecurityManager instance = factory.getInstance();
//使SecurityManager可以訪問
SecurityUtils.setSecurityManager(instance);
//接受提交的用戶名和密碼:
UsernamePasswordToken tooken = new UsernamePasswordToken("admin","123456");
//獲取當前主體
Subject subject = SecurityUtils.getSubject();
try {
subject.login(tooken);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("是否認證成功:" + subject.isAuthenticated());
}
用戶名和密碼正確
用戶名錯誤
密碼錯誤