首先通过用户登录获取到Subject对象,通过里面的一些方法来判断用户的角色.
1.判断是否拥有该角色,返回boolean值
subject.hasRole("role2") 返回一个boolean型
subject.hasRoles(List<String> list)返回一个boolean型数组,通过循环对面一个角色进行判断
subject.hasAllRoles(List<String> list)返回一个boolean型,判断用户是否拥有所有角色
检测是否拥有该角色,如果没有直接抛出异常
subject.checkRole("role1"); subject.checkRoles(Arrays.asList("role1","role2")); subject.checkRoles("role1","role2");
2.权限验证:返回boolean值,用法和角色认证一样
subject.isPermitted(String str);
subject.isPermitted(String...strings);
subject.isPermittedAll(String...strings);
3.新建.ini文件,建立一个角色的.ini和一个权限的.ini文件
左边表示用户,右边第一个表示密码,后面就表示该用户所拥有的角色
上面的users表示用户和角色,下面是设置该角色所拥有的权限
4.添加一个junit包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
5.新建一个测试类
/** * 角色认证授权-HasRole */ @Test public void roleHasRole(){ Subject subject = login("classpath:shiro_role.ini","spf","123456"); System.out.println(subject.hasRole("role2")?"有role2角色":"没有role2角色"); boolean[] flags = subject.hasRoles(Arrays.asList("role1","role2")); System.out.println(flags[0]?"有role1角色":"没有role1角色"); System.out.println(flags[1]?"有role2角色":"没有role2角色"); System.out.println(subject.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2两个角色都有":"role1,role2两个角色不全有"); subject.logout(); } /** * 角色认证授权-CheckRole * 认证不成功就抛出异常 */ @Test public void roleCheckRole(){ Subject subject = login("classpath:shiro_role.ini","spf","123456"); subject.checkRole("role1"); subject.checkRoles(Arrays.asList("role1","role2")); subject.checkRoles("role1","role2"); subject.logout(); } /** * 权限认证授权-isPermitted */ @Test public void rolePermitted(){ Subject subject = login("classpath:shiro_permitted.ini","spf","123456"); //Subject subject = login("classpath:shiro_permitted.ini","jack","123"); System.out.println(subject.isPermitted("update")?"有update这个权限":"没有update这个权限"); boolean[] flags = subject.isPermitted("select","update"); System.out.println(flags[0]?"有select这个权限":"没有select这个权限"); System.out.println(flags[1]?"有update这个权限":"没有update这个权限"); System.out.println(subject.isPermittedAll("select","update")?"有select,update这两个权限":"select,update这两个权限不全有"); subject.logout(); } private Subject login(String url, String username, String password){ // 读取配置文件,初始化SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory(url); // 获取securityManager实例 SecurityManager securityManager=factory.getInstance(); // 把securityManager实例绑定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 得到当前执行的用户 Subject subject = SecurityUtils.getSubject(); // 创建token令牌,用户名/密码 UsernamePasswordToken token=new UsernamePasswordToken(username, password); try { // 身份认证 subject.login(token); System.out.println("身份认证成功"); } catch (AuthenticationException e) { e.printStackTrace(); if (e instanceof IncorrectCredentialsException) { throw new IncorrectCredentialsException("密码错误"); } else if (e instanceof UnknownAccountException) { throw new UnknownAccountException("用户名错误"); } } return subject; }
感谢该文章的作者,作者的链接https://blog.csdn.net/qq_32331997/article/details/77978041