Shiro身份驗證Realm

一、固定信息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()); // 取得用戶名
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章