Shiro安全框架--自定義認證
阿新 • • 發佈:2018-12-31
上一篇簡單的介紹了Shiro的基礎認證,這一篇就簡單的舉個自定義認證的例子
1.和之前一樣先引入依賴:
<!--匯入shiro-web的依賴 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version> </dependency> <!-- 匯入shiro-core的依賴 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <!-- 匯入shiro-spring 的依賴--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency> <!-- 匯入/commons-logging的依賴 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
2.配置好自定義Shiro.ini的資訊
#自定義認證的全路徑限定名
myreal=com.zking.shiro.MyShrioRealm
securityManager.realms=$myreal
3.建立自定義 MyShiroReaml類 繼承 AuthorizingRealm(裡面有認證和授權的方法)
/** * 授權 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } /** * 認證 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //獲取傳遞過來的資料 UsernamePasswordToken usernamePasswordToken=(UsernamePasswordToken)authenticationToken; String username=usernamePasswordToken.getUsername(); String pwd=usernamePasswordToken.getPassword().toString(); String dbpwd="123456"; //建立返回資料的認證物件 這裡的資料要去和資料庫的資料進行比對 //simpleAuthenticationInfo認證資料 //username根據使用者找到密碼 SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(username,dbpwd,this.getName()); //返回認證 return simpleAuthenticationInfo; }
4.在測試類測試
/** * shiro的自定義認證realm */ @Test public void test2(){ //讀取配置檔案 就會新建一個SecurityManager工廠物件 配置資訊就會放到物件裡面取 注意包 Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro2.ini"); //獲取SecurityManager物件 SecurityManager securityManager=factory.getInstance(); //將securityManager設定在當前的環境中 SecurityUtils.setSecurityManager(securityManager); //獲取當前操作物件 Subject subject=SecurityUtils.getSubject(); //例項化令牌 UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("admin","123456"); //登入 需要一個令牌物件 subject.login(usernamePasswordToken); //輸出看認證是否通過 System.out.println(subject.isAuthenticated()); }
返回結果為true.
自定義認證是根據名稱走的,名稱去找到密碼,在認證的時候就只認證密碼就行啦,這就要求名稱是唯一的.