Shiro的Subject对象详解

什么是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 Session的实现的是DelegatingSession,我们看一下它默认的setAttribute的实现 看一下NativeSessionManager 这里注明了这是shiro提供的本地会话工厂,如我们之前所说,它并不需要依赖于http服务器。而当我们整合HTTP服务器时,shiro Session会自动实现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 ———————————————— 版权声明:本文为CSDN博主「川哟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_21046665/article/details/79735922
搜索