シロのサブジェクトオブジェクトの詳細な説明

Subject オブジェクトとは

通常、サブジェクト オブジェクトはユーザーとして理解されますが、サード パーティのプログラムである場合もありますが、これは抽象的な概念であり、システムとやり取りするすべての「もの」がサブジェクトであると理解できます。

Subject オブジェクトの取得方法

最初に初期化ファイルを作成します

shiro.ini

[users]
root=123,admin,person
manage=123,campaign

[roles]
admin=*
person = xiaoming:*
campaign = xiaoming:drive:car

ユーザー

ユーザー名=パスワード、役割

役割の役割

役割 = 権限

        //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //2、得到SecurityManager实例 并绑定给SecurityUtils
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //获得当前正在执行的subject
        Subject subject = SecurityUtils.getSubject();

Subject オブジェクトを取得する

Subject subject = SecurityUtils.getSubject(); 

現在のサブジェクトは SecurityUtils.getSubject() で取得できます

件名で何ができますか?

セッション オブジェクトを取得する

Session session = subject.getSession();
session.setAttribute( "someKey", "aValue" ); 

ここでの Session は HttpSession ではなく shiro が提供するものです. 動作は HttpSession と同じです. 両者の最大の違いは shiro セッションが http サーバーに依存する必要がないことです. 次の図は shiro セッションの実装クラスです.

デフォルトでは、shiro セッションは DelegatingSession を実装しています。setAttribute のデフォルトの実装を見てみましょう。

NativeSessionManager を見てください

ここで、これは shiro が提供するローカル セッション ファクトリであることに注意してください. 前述のように、http サーバーに依存する必要はありません。HTTP サーバーを統合すると、shiro セッションは自動的に HttpServletSession を実装します。HttpServletSession の実装を見てみましょう。

ここでの httpSession の完全なパッケージ名はjavax.servlet.http.HttpSession であり、httpSession を正常に操作できることを意味します。

前に、Subject は現在のユーザーとして理解できると言いましたが、どうすればあなたが現在のユーザーであるかを知ることができますか? もちろん、ログインする必要があります。

//创建一个用户
UsernamePasswordToken token = new UsernamePasswordToken("root","123");
//是否记住用户
token.setRememberMe(true);
//登录
subject.login(token);

ログインに失敗した場合の対処方法は?

        //登录
        try {
            subject.login(token);
            //没有抛异常则登录成功
        } catch ( UnknownAccountException uae ) {
            System.out.println("用户名不存在");
        } catch ( IncorrectCredentialsException ice ) {
            System.out.println("密码错误");
        } catch ( LockedAccountException lae ) {
            System.out.println("用户被锁定,不能登录");
        } catch ( AuthenticationException ae ) {
            System.out.println("严重的错误");
        }

現在ログインしているユーザー名を取得する

            String currentUser = subject.getPrincipal().toString();
            System.out.println("当前登录的用户是:"+currentUser);

現在のユーザーの権限を確認する

            //判断用户是否是拥有某种角色
            boolean isRole = subject.hasRole( "admin" );
            //是否拥有某种功能
            boolean isPer = subject.isPermitted("xiaoming:run");

最後に、ログアウトします

            //退出登录
            subject.logout();

最終的なコード

    @Test
    public void testSubject() {
        //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //2、得到SecurityManager实例 并绑定给SecurityUtils
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //获得当前正在执行的subject
        Subject subject = SecurityUtils.getSubject();
        //获得shiro sessino实例
        Session session = subject.getSession();
        //创建一个用户
        UsernamePasswordToken token = new UsernamePasswordToken("root","123");
        //是否记住用户
        token.setRememberMe(true);
        //登录
        try {
            subject.login(token);
            //没有抛异常则登录成功
            String currentUser = subject.getPrincipal().toString();
            System.out.println("当前登录的用户是:"+currentUser);
            //判断用户是否是拥有某种角色
            boolean isRole = subject.hasRole( "admin" );
            //是否拥有某种功能
            boolean isPer = subject.isPermitted("xiaoming:run");
            //退出登录
            subject.logout();
        } catch ( UnknownAccountException uae ) {
            System.out.println("用户名不存在");
        } catch ( IncorrectCredentialsException ice ) {
            System.out.println("密码错误");
        } catch ( LockedAccountException lae ) {
            System.out.println("用户被锁定,不能登录");
        } catch ( AuthenticationException ae ) {
            System.out.println("严重的错误");
        }
    }

shiro.ini

[users]
root=123,admin,person
manage=123,campaign

[roles]
admin=*
person = xiaoming:*
campaign = xiaoming:drive:car

おすすめ

転載: blog.csdn.net/qq_21046665/article/details/79735922
おすすめ