一、固定信息Realm認證
如果要想使用Realm操作,那麼必須要保證有一個具體的認證類實現了Realm接口。
配置shiro.ini文件
[users]
admin=hello,member,dept
mldn=java,dept,emp
[roles]
member=member:add,member:edit,member:remove
dept=dept:add,dept:edit,dept:list
emp=emp:*
1、建立一個MyRealm子類,該類實現Realm接口;
認證信息:org.apache.shiro.authc.AuthenticationInfo,接口有兩個方法:
|- 取得所有的身份信息:public PrincipalCollection getPrincipals();
|- 取得認證信息:public Object getCredentials()。
子類:org.apache.shiro.authc.SimpleAuthenticationInfo;
|- 構造方法:public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName)。
所有用戶的信息都保存在token裏面:org.apache.shiro.authc.AuthenticationToken,此接口定義有如下兩個方法:
|- 身份數據:public Object getPrincipal();
|- 認證數據:public Object getCredentials()。
|- 此時返回的數據爲char[]數組,不能直接轉換爲String;
自定義Realm
public class MyRealm implements Realm {
@Override
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal() ; // 取得用戶名
// 在Shiro裏面是利用字符數組實現了密碼的傳遞,所以不能將其直接變爲String
String password = new String((char[]) token.getCredentials()) ; // 取得密碼
// 此時直接使用一個固定的用戶名和密碼進行驗證處理操作
if (!"admin".equals(username)) { // 判斷用戶名是否存在
throw new UnknownAccountException("用戶名不存在!") ;
}
if (!"hello".equals(password)) {
throw new IncorrectCredentialsException("密碼輸入錯誤!") ;
}
return new SimpleAuthenticationInfo(username,password,this.getName()) ;
}
@Override
public String getName() {
return "MyRealm"; // 名字隨便給一個,只要能唯一標記即可
}
@Override
public boolean supports(AuthenticationToken token) {
// 本次將在之前程序的基礎之上繼續使用UsernamePasswordToken完成信息的傳遞
return token instanceof UsernamePasswordToken ;
}
}
2、修改shiro.ini文件
myRealm=cn.mldn.realm.MyRealm
# 整個Shiro中的驗證處理都是由SecurityManager接口負責的
securityManager.realms=$myRealm
這個時候一定要注意,如果有多個Realm,則在“securityManager.realms”後面可以設置多個名稱,中間使用“,”分割。
3、使用該Realm進行數據的認證處理:
public class TestLoginDemo {
public static void main(String[] args) {
// 取得Factory接口對象,主要的目的是通過配置文件加載文件之中的信息,這些信息暫時不能夠成爲認證信息
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 取得裏面所保存的所有的認證數據信息
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
// 利用一個專門的認證操作的處理類,實現認證處理的具體的實現
SecurityUtils.setSecurityManager(securityManager);
// 獲取進行用戶名和密碼認證的接口對象
Subject subject = SecurityUtils.getSubject() ;
// 定義了一個Token,裏面保存要登錄的用戶名和密碼信息
UsernamePasswordToken token = new UsernamePasswordToken("admin","hello") ;
// 實現用戶登錄處理
subject.login(token);
System.out.println(subject.getPrincipal()); // 取得用戶名
}
}