shiro基礎入門

     	      					shiro 基礎篇1
  • Subject(用戶主體)
  • SecurityManager(核心安全管理器,認證授權都要經過該對象,相當於springmvc dispatcher)
  • realm(數據庫)

認證過程
在這裏插入圖片描述
在這裏插入圖片描述

shiro常見異常:
在這裏插入圖片描述
realm接口體系
在這裏插入圖片描述
自定義realm

  • 一般都會繼承AuthorizingRealm抽象類,因爲該類具備了緩存,認證,授權的方法。
  1. 自定義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;
    }
}
  1. 自定義realm文件
 #自定義realm
myrealm=com.yxt.realm.MyRealm
#指定securityManager的realms實現
securityManager.realms=$myrealm
  1. 加載配置文件,執行登錄操作
  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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章