shiro权限框架-鉴权
上期我们已经讲解了shiro的基本使用和入门基础,这期我来带大家了解一下shiro如何鉴定该用户是否拥有这个权限。
首先这里我不推荐大家直接使用 System.out.println()输出语句打印出想输出的内容,推荐大家使用log4j来进行打印。
想使用log4j只需引入的包即可
附上log4j的代码
log4j.rootLogger=debug,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%d{yyyy-mm-dd}] -%p -%m%n
多余的话就不说了直接上代码
import org.apache.shiro.SecurityUtils; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; public class ShiroUtils { public static Subject getSubject(){ //读取shiro.ini文件获取Factory工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini"); //获取factory实例并得到SecurityManager SecurityManager securityManager = factory.getInstance(); //设置安全管理器 SecurityUtils.setSecurityManager(securityManager); //反显出Subject对象 return SecurityUtils.getSubject(); } }
首先编写一个工具类,这个工具类可以获取当前登录的对象,为了减少代码冗余,不理解的看博主的上一遍博客理解一下。
编写完工具类以后就可以进行鉴权操作了,首先老规矩创建一个测试类Test
鉴权流程:
1.首先利用工具类获取Subject对象
2.利用shiro权限框架自带的登录判断方法判断是否已经进行了认证
3.鉴别当前登录的用户所拥有的权限简称(鉴权)
接下来附上代码
import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; public class Testpermission { /** * 基于权限permission的授权 */ private static final Logger logger = LoggerFactory.getLogger(Testpermission.class); @Test public void testpermission(){ Subject subject = ShiroUtils.getSubject(); if(!subject.isAuthenticated()){/*判断是否通过身份验证*/ UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin","123"); try { subject.login(usernamePasswordToken);//登录 logger.info("登陆成功"); }catch (Exception e){ logger.info("登录失败"); e.printStackTrace(); } boolean permitted = subject.isPermitted("role:*");//是否被允许拥有权限 if(permitted){ logger.info(subject.getPrincipal()+"具备role角色的全部权限"); } boolean[] permitted1 = subject.isPermitted("role:*", "user:*");//是否被允许拥有多个权限 logger.info(subject.getPrincipal()+"是否具备role角色的全部权限和user角色的全部权限"+ Arrays.toString(permitted1)); } subject.logout(); } }
老规矩和大家一一解释其中方法的作用
isAuthenticated():判断是否通过身份验证
login():登录
isPermitted():是否被允许拥有权限,这个方法是进行了重载的,可以填一个或多个权限
getPrincipal():获取当前登录对象的用户名
其实鉴权的操作非常简单,只是调用Subject对象内置的方法来进行一个判断,
下期将带来shiro权限框架与web前端的交互,敬请期待!