<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[Shiro后台实现验证权限]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Sun, 28 Jun 2020 07:18:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	今天在项目中发现一个问题:使用shiro的时候，虽然隐藏掉了一些菜单，但是当我们通过get请求直接访问菜单的时候还是会访问到，也就是shiro可以在界面实现隐藏一些信息，但是没有真正的根据权限码验证请求，于是想自己在后台实现验证。<br/>　　<br/>需求:有权限(权限码是systemmanager:settings)的人可以点击系统设置跳转到系统设置页面，没权限的人看不到菜单，但是通过get访问可以访问到，于是需要在后台拦截。<br/><br/>实现思路:在需要精确验证的方法开始先验证权限，如果验证成功啥也不做，验证失败的话就抛出一个没有权限的异常。在拦截器中捕捉到异常就记录日志，并返回到提醒页面。<br/><br/> <br/>1.　　验证Shiro权限的工具类(此工具还可以进一步完善，封装为判断是否有指定角色，或者有任意角色)<br/><br/><br/>package com.microxiang.common.util;<br/><br/>import com.microxiang.common.constant.ResultCode;<br/>import com.microxiang.common.exception.user.NoPermissionException;<br/>import com.microxiang.common.system.vo.LoginUser;<br/>import lombok.extern.slf4j.Slf4j;<br/>import org.apache.shiro.SecurityUtils;<br/>import org.apache.shiro.subject.Subject;<br/><br/>/**<br/> * 验证shiro权限的工具类<br/> *<br/> * @author jiangjun<br/> */<br/>@Slf4j<br/>public class ShiroPermissionUtils &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private ShiroPermissionUtils() &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 检查当前用户是否有权限(任意一项)<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param permissionCodes 任意权限<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws NoPermissionException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void checkPermissionAny(String... permissionCodes) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (permissionCodes == null &#124;&#124; permissionCodes.length == 0) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取用户信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject currentUser = SecurityUtils.getSubject();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (String permission : permissionCodes) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean permitted = currentUser.isPermitted(permission);// 判断是否有权限<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (permitted) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 没权限就抛出一个异常<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object principal = currentUser.getPrincipal();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (principal instanceof LoginUser) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginUser user = (LoginUser) principal;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(&quot;user &#123;&#125; no permission !&quot;, user.getUsername());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new NoPermissionException(&quot;user no permission !&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 检查当前用户是否有权限(所有的)<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param permissionCodes 任意权限<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws NoPermissionException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void checkPermissionAll(String... permissionCodes) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (permissionCodes == null &#124;&#124; permissionCodes.length == 0) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取用户信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject currentUser = SecurityUtils.getSubject();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (String permission : permissionCodes) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean permitted = currentUser.isPermitted(permission);// 判断是否有权限<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!permitted) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 没权限就抛出一个异常<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object principal = currentUser.getPrincipal();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (principal instanceof LoginUser) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginUser user = (LoginUser) principal;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(&quot;user &#123;&#125; no permission !&quot;, user.getUsername());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new NoPermissionException(&quot;no permission &quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/><br/><br/><br/>解释:<br/><br/>　　(1)Subject currentUser = SecurityUtils.getSubject();&nbsp;&nbsp;&nbsp;&nbsp;先获取到Subject，<br/><br/>　　(2)boolean permitted = currentUser.isPermitted(permission);&nbsp;&nbsp;&nbsp;&nbsp; 然后验证权限<br/><br/>　　(3)如果验证失败就记录日志，(获取到subject中的principal，principal其实是认证的时候装进SimpleAuthenticationInfo的user对象)<br/><br/>Object principal = currentUser.getPrincipal();<br/>if (principal instanceof User) &#123;<br/>User user = (User) principal;<br/>log.error(&quot;user &#123;&#125; no permission !&quot;, user.getUsername());<br/>&#125;<br/>throw new NoPermissionException(&quot;no permission &quot;);<br/><br/> 2.自定义异常(如果不自定义异常，也可以在程序中抛出一个运行时异常throw new RuntimeException(&quot;XXXXX&quot;);)<br/> 　　必须继承RuntimeException，运行时异常不需要在抛出异常的时候显示的捕捉或者声明(throws.....),如果继承Exception为检查异常，需要捕捉或者throws声明.<br/><br/>package com.microxiang.common.exception.user;<br/><br/>import com.microxiang.common.constant.ResultCode;<br/>import com.microxiang.common.exception.BusinessException;<br/><br/>/**<br/> * 没有权限异常<br/> * Created by jiangjun on 2020/6/28 14:47<br/> */<br/>public class NoPermissionException extends BusinessException &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public NoPermissionException() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(ResultCode.USER_NOT_AUTHORIZED);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public NoPermissionException(String message) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(ResultCode.USER_NOT_AUTHORIZED.getCode(), message);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public NoPermissionException(String message, Throwable cause) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(ResultCode.USER_NOT_AUTHORIZED.getCode(), message, cause);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/>至此，完成了后台验证，也就是在所有方法开始先验证权限。<br/><br/>还有另一种办法就是自定义注解实现权限验证，有点类似于shiro自带的注解验证权限，参<br/>Tags - <a href="https://www.heckjj.com/tags/shiro%25E4%25BB%25A3%25E7%25A0%2581%25E9%2587%258C%25E5%2588%25A4%25E6%2596%25AD%25E6%259D%2583%25E9%2599%2590/" rel="tag">shiro代码里判断权限</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] Shiro后台实现验证权限]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>