Shiro的Subject对象详解

Shiro的Subject对象详解什么是Subject对象通常我们会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。如何获得Subject对象首先创建一个初始化文件shiro.ini[users]root=123,admin,personmanage=123,campaign[roles]admin=*person=xia…

大家好,欢迎来到IT知识分享网。

什么是Subject对象

通常我们会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。

如何获得Subject对象

首先创建一个初始化文件

shiro.ini

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

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

users用户

用户名=密码,角色

roles角色

角色=权限

        //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()可以获得当前的Subject

得到Subject能干嘛

获得Session对象

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

这里的Session并不是HttpSession,而是shiro为我们提供的,它的操作与HttpSession一样,他们最大的区别就是shiro session不需要依赖http服务器,下图是shiro Session的实现类。

Shiro的Subject对象详解

默认情况下shiro Session的实现的是DelegatingSession,我们看一下它默认的setAttribute的实现

Shiro的Subject对象详解

Shiro的Subject对象详解

看一下NativeSessionManager

Shiro的Subject对象详解

这里注明了这是shiro提供的本地会话工厂,如我们之前所说,它并不需要依赖于http服务器。而当我们整合HTTP服务器时,shiro Session会自动实现HttpServletSession,再来看一下HttpServletSession的实现

Shiro的Subject对象详解

这里的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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/21528.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信