Shiro (包含權限知足其中一個就經過的用法)

<div class="exp-content-block"><h2 class="exp-content-head"><a href="javascript:;" name="section-3"></a>方法/步驟<div class="audio-wp audio-wp-2" data-text="" data-for="" data-index="2" style="display: inline-block;"><span class="audio-inner"><span class="audio-icon"></span><span class="audio-icon-2"></span><span class="audio-icon-3"></span></span><span class="desc"></span></div></h2><div class="exp-content-body"><ol class="exp-conent-orderlist"><li class="exp-content-list list-item-1"><div class="list-icon" style="visibility: hidden;">1</div><div class="content-list-text"><p>web.xml添加配置</p><p><br>&lt;!-- shiro過濾器 --&gt;</p><p>&nbsp;&lt;filter&gt;</p><p>&nbsp;&nbsp;&lt;filter-name&gt;shiroFilter&lt;/filter-name&gt;</p><p>&nbsp;&nbsp;&lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;</p><p>&nbsp;&nbsp;&lt;init-param&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;targetFilterLifecycle&lt;/param-name&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;</p><p>&nbsp;&nbsp;&lt;/init-param&gt;</p><p>&nbsp;&lt;/filter&gt;</p><p>&nbsp;&lt;filter-mapping&gt;</p><p>&nbsp;&nbsp;&lt;filter-name&gt;shiroFilter&lt;/filter-name&gt;</p><p>&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</p><p>&nbsp;&lt;/filter-mapping&gt;<br></p></div></li><li class="exp-content-list list-item-2"><div class="list-icon" style="visibility: hidden;">2</div><div class="content-list-text"><p>shiro與spring整合配置</p><p><br>&lt;!-- 使用shiro安全檢查註解 --&gt;</p><p>&nbsp;&lt;bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" /&gt;</p><p>&nbsp;</p><p>&nbsp;&lt;bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&gt;</p><p>&nbsp;&nbsp;&lt;property name="securityManager" ref="securityManager" /&gt;</p><p>&nbsp;&lt;/bean&gt;<br></p><p><br></p><p><br>&nbsp;&lt;!-- shiro的生命週期處理器 --&gt;</p><p>&nbsp;&lt;bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /&gt;</p><p>&nbsp;</p><p>&nbsp;&lt;!-- shiro自帶的密碼匹配器(用來校驗密碼足夠了) --&gt;</p><p>&nbsp; &lt;bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.SimpleCredentialsMatcher"&gt;&lt;/bean&gt;&nbsp;</p><p>&nbsp;&lt;!-- security datasource: --&gt;</p><p>&nbsp;&lt;bean id="myRealm" class="cc.eguid.service.shiro.MyRealm"&gt;</p><p>&nbsp;&nbsp;&lt;property name="credentialsMatcher" ref="credentialsMatcher"/&gt;&lt;!-- 密碼匹配器 --&gt;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="cachingEnabled" value="false"/&gt;&lt;!-- 禁止緩存 --&gt;</p><p>&nbsp;&lt;/bean&gt;</p><p>&nbsp;&lt;!-- 安全管理器 --&gt;</p><p>&nbsp;&lt;bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&gt;</p><p>&nbsp;&nbsp;&lt;property name="realm" ref="myRealm" /&gt;</p><p>&nbsp;&lt;/bean&gt;</p><p>&nbsp;&lt;!-- shiro過濾器 --&gt;</p><p>&nbsp;&lt;bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&gt;</p><p>&nbsp;&nbsp;&lt;!-- 配置安全管理器 --&gt;</p><p>&nbsp;&nbsp;&lt;property name="securityManager" ref="securityManager" /&gt;</p><p>&nbsp;&nbsp;&lt;!-- 身份認證失敗跳轉的地址 --&gt;</p><p>&nbsp;&nbsp;&lt;property name="loginUrl" value="/login/" /&gt;</p><p>&nbsp;&nbsp;&lt;!-- 身份認證成功跳轉的地址 --&gt;</p><p>&nbsp;&nbsp;&lt;property name="successUrl" value="/" /&gt;</p><p>&nbsp;&nbsp;&lt;!-- 權限認證失敗跳轉的地址 --&gt;</p><p>&nbsp;&nbsp;&lt;property name="unauthorizedUrl" value="/login/unauthorized" /&gt;</p><p>&nbsp;&nbsp;&lt;property name="filterChainDefinitions"&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;!--anon 表示匿名訪問,不須要認證以及受權 --&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;!--authc表示須要認證 沒有進行身份認證是不能進行訪問的 --&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;!--authc,roles[admin]表示是admin角色的用戶才能訪問 --&gt;</p><p>&nbsp;&nbsp;&nbsp;&lt;value&gt;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/static/** = anon</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/login/** = anon</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/common/** = anon</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/admin/** = authc,roles[admin]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/* = authc</p><p>&nbsp;&nbsp;&nbsp;&nbsp;/** = authc</p><p>&nbsp;&nbsp;&nbsp;&lt;/value&gt;</p><p>&nbsp;&nbsp;&lt;/property&gt;</p><p>&nbsp;&lt;/bean&gt;</p><p>&nbsp;<br></p></div></li><li class="exp-content-list list-item-3"><div class="list-icon" style="visibility: hidden;">3</div><div class="content-list-text"><p>realm和自定義密碼校驗器實現</p><p><br>public class MyRealm extends AuthorizingRealm{</p><p>&nbsp;Logger log=Logger.getLogger(MyRealm.class);</p><p>&nbsp;</p><p>&nbsp;@Autowired</p><p>&nbsp;&nbsp;&nbsp; private UserService userService;//這是本身實現的用戶信息操做類,實現用戶信息,用戶角色信息、用戶權限信息查詢功能</p><p>&nbsp;</p><p>&nbsp;@Override</p><p>&nbsp;protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {</p><p>&nbsp;&nbsp;UserInfo user = (UserInfo) principals.getPrimaryPrincipal();</p><p>&nbsp;&nbsp;SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();</p><p>&nbsp;&nbsp;// 查詢角色信息</p><p>&nbsp;&nbsp;Collection&lt;String&gt; roles = userService.findRoles(user);</p><p>&nbsp;&nbsp;info.addRoles(roles);</p><p>&nbsp;&nbsp;log.info("shiro獲取用戶所屬角色列表:"+roles);</p><p>&nbsp;&nbsp;// 查詢權限信息</p><p>&nbsp;&nbsp;Collection&lt;String&gt; permissions = userService.findPermissions(user.getSystemuserid());</p><p>&nbsp;&nbsp;info.addStringPermissions(permissions);</p><p>&nbsp;&nbsp;log.info("shiro獲取用戶權限列表:"+permissions);</p><p>&nbsp;&nbsp;return info;</p><p>&nbsp;}</p><p>&nbsp;</p><p>&nbsp;@Override</p><p>&nbsp;protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException{</p><p>&nbsp;&nbsp;//用戶輸入的用戶名密碼</p><p>&nbsp;&nbsp;String loginname=&nbsp; token.getPrincipal().toString();</p><p>&nbsp;&nbsp;Object password=token.getCredentials();</p><p>&nbsp;&nbsp;log.info("shiro正在處理嘗試登陸的用戶信息:"+loginname+",密碼:"+new String((char[])password));</p><p>&nbsp;&nbsp;//數據庫中的用戶信息</p><p>&nbsp;&nbsp;UserInfo user =userService.queryUserInfoByLoginName(loginname);</p><p>&nbsp;&nbsp;if(user==null||CommonUtil.isNull(user.getLoginusername(),user.getPassword(),user.getSystemuserid())){</p><p>&nbsp;&nbsp;&nbsp;return null;</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;log.info("shiro獲取到當前用戶嘗試登陸的真實數據:"+user.getLoginusername()+",密碼:"+user.getPassword());</p><p>&nbsp;&nbsp;//數據庫中的正確的帳戶信息</p><p>&nbsp;&nbsp;AuthenticationInfo accountInfo =new SimpleAuthenticationInfo(user, user.getPassword(),getName());</p><p>&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;//本身獲取密碼驗證器(因爲shiro實現的密碼校驗方法是密碼錯誤會直接拋異常,不採用,因此改爲直接手動校驗)</p><p>&nbsp;&nbsp;CredentialsMatcher matcher=getCredentialsMatcher();</p><p>&nbsp;&nbsp;if(matcher==null){</p><p>&nbsp;&nbsp;&nbsp;log.error("沒有配置密碼匹配器");</p><p>&nbsp;&nbsp;&nbsp;return null;</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;//校驗密碼</p><p>&nbsp;&nbsp;if(matcher.doCredentialsMatch(token,accountInfo)){</p><p>&nbsp;&nbsp;&nbsp;return accountInfo;//校驗經過,返回帳號信息</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;return null;</p><p>&nbsp;}</p><p>&nbsp;</p><p>&nbsp;</p><p>}<br></p></div></li><li class="exp-content-list list-item-4"><div class="list-icon" style="visibility: hidden;">4</div><div class="content-list-text"><p>自定義密碼校驗器</p><p><br>/**</p><p>&nbsp;* 自定義shiro密碼匹配(密碼是在md5散列值的基礎上再次進行md5加鹽操做,加鹽值不保存在數據庫,而是放在配置文件中)</p><p>&nbsp;* @author eguid</p><p>&nbsp;*</p><p>&nbsp;*/</p><p>public class MyCredentialsMatcher extends CodecSupport implements CredentialsMatcher {</p><p>&nbsp;private static final Logger log = LoggerFactory.getLogger(MyCredentialsMatcher.class);</p><p>&nbsp;</p><p>&nbsp;protected Object getCredentials(AuthenticationToken token) {</p><p>&nbsp;&nbsp;return token.getCredentials();</p><p>&nbsp;}</p><p>&nbsp;</p><p>&nbsp;protected Object getCredentials(AuthenticationInfo info) {</p><p>&nbsp;&nbsp;return info.getCredentials();</p><p>&nbsp;}</p><p>&nbsp;</p><p>&nbsp;@Autowired</p><p>&nbsp;private CommonConfigs commonConfigs;</p><p>&nbsp;/**</p><p>&nbsp; * 驗證密碼</p><p>&nbsp; *</p><p>&nbsp; * @param tokenCredentials</p><p>&nbsp; * @param accountCredentials</p><p>&nbsp; * @return</p><p>&nbsp; */</p><p>&nbsp;protected boolean equals(Object tokenCredentials, Object accountCredentials) {</p><p>&nbsp;&nbsp;if (log.isDebugEnabled()) {</p><p>&nbsp;&nbsp;&nbsp;log.debug("Performing credentials equality check for tokenCredentials of type ["</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ tokenCredentials.getClass().getName() + " and accountCredentials of type ["</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ accountCredentials.getClass().getName() + "]");</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;if (isByteSource(tokenCredentials) &amp;&amp; isByteSource(accountCredentials)) {</p><p>&nbsp;&nbsp;&nbsp;if (log.isDebugEnabled()) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;log.debug("Both credentials arguments can be easily converted to byte arrays.&nbsp; Performing "</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "array equals comparison");</p><p>&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;byte[] tokenBytes = toBytes(tokenCredentials);</p><p>&nbsp;&nbsp;&nbsp;byte[] accountBytes = toBytes(accountCredentials);</p><p>&nbsp;&nbsp;&nbsp;return MessageDigest.isEqual(tokenBytes, accountBytes);</p><p>&nbsp;&nbsp;} else {</p><p>&nbsp;&nbsp;&nbsp;return accountCredentials.equals(tokenCredentials);</p><p>&nbsp;&nbsp;}</p><p>&nbsp;}</p><p>&nbsp;</p><p>&nbsp;public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {</p><p>&nbsp;&nbsp;Object tokenCredentials = getCredentials(token);</p><p>&nbsp;&nbsp;Object accountCredentials = getCredentials(info);</p><p>&nbsp;&nbsp;String account=String.valueOf((char[])tokenCredentials);</p><p>&nbsp;&nbsp;if(commonConfigs.getMd5salt()==null){</p><p>&nbsp;&nbsp;&nbsp;if (log.isDebugEnabled()) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;log.debug("配置文件中的加鹽值爲空,沒法進行密碼匹配,請確認配置文件是否在指定位置或配置指定加鹽值");</p><p>&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;return false;</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;String saltaccount=MD5Util.getMD5(account, commonConfigs.getMd5salt());</p><p>&nbsp;&nbsp;if (log.isDebugEnabled()) {</p><p>&nbsp;&nbsp;&nbsp;log.debug("加鹽後的密碼:"+saltaccount);</p><p>&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;return equals(accountCredentials, saltaccount.toCharArray());</p><p>&nbsp;}</p><p>&nbsp;</p><p>}<br></p></div></li><li class="exp-content-list list-item-5"><div class="list-icon" style="visibility: hidden;">5</div><div class="content-list-text"><p>註解使用及模板標籤使用</p><p>一、註解使用<br>@RequiresPermissions({"user:update:view"})//檢查操做權限<br>@RequiresPermissions(value={"user:add","user:view"},logical=Logical.OR)//兩個操做權限其中一個知足條件便可經過檢查<br>@RequiresRoles({"admin"})//檢查角色<br>@RequiresRoles(value={"debug","admin"},logical=Logical.OR)//兩個角色其中一個角色知足條件便可</p><p>@RequiresAuthentication//檢查是否經過shiro認證<br>@RequiresGuest//不須要驗證<br>@RequiresUser//檢查用戶是不是當前系統中的用戶</p><p>二、標籤使用<br>使用標籤須要先導入shiro的標籤庫&lt;%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %&gt;<br>(1)顯示用戶身份信息<br>&lt;shiro: principal/&gt;<br>默認調用Subject.getPrincipal()獲取</p><p>&lt;shiro:principal property="username"/&gt;<br>至關於((User)Subject.getPrincipals()).getUsername()</p><p>(2)已登陸shiro用戶顯示</p><p>&nbsp;&lt;shiro:user&gt;&nbsp; <br>歡迎[&lt;shiro:principal/&gt;]登陸,&lt;a href="logout"&gt;退出&lt;/a&gt;&nbsp; <br>&lt;shiro:user&gt;</p><p>(3)匿名用戶訪問<br>&lt;shiro:guest&gt;未通過shiro驗證的用戶(遊客,匿名用戶)&lt;/shiro:guest&gt;&nbsp;</p><p>(4)已經在shiro登陸過的(已登陸用戶)</p><p>&nbsp;&lt;shiro:authenticated&gt;&nbsp; <br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]已身份驗證經過&nbsp; <br>&lt;shiro:authenticated&gt;</p><p>(5)沒有在shiro登陸過的</p><p><br>&nbsp;&lt;shiro:notAuthenticated&gt;<br>&nbsp;&nbsp;&nbsp; 未身份驗證(包括記住我)<br>&lt;shiro:notAuthenticated&gt;</p><p>(6)檢查角色</p><p>&nbsp;&lt;shiro:hasRole name="admin"&gt;<br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]擁有角色admin&lt;br/&gt;<br>&lt;shiro:hasRole&gt;</p><p>檢查任意角色(其中一個知足條件即經過,至關於OR)<br>&nbsp;&lt;shiro:hasAnyRoles name="admin,user"&gt;<br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]擁有角色admin或user&lt;br/&gt;<br>&lt;shiro:hasAnyRoles&gt;</p><p>不具備角色(反向判斷)<br>&nbsp;&lt;shiro:lacksRole name="abc"&gt;<br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]不具備角色abc&lt;br/&gt;<br>&lt;shiro:lacksRole&gt;</p><p>(7)操做權限判斷</p><p>&nbsp;&lt;shiro:hasPermission name="user:create"&gt;&nbsp; <br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]擁有權限user:create&lt;br/&gt;&nbsp; <br>&lt;shiro:hasPermission&gt;&nbsp;&nbsp;&nbsp;</p><p>不具備操做權限(反向判斷)</p><p><br>&nbsp;&lt;shiro:lacksPermission name="org:create"&gt;&nbsp; <br>&nbsp;&nbsp;&nbsp; 用戶[&lt;shiro:principal/&gt;]沒有權限org:create&lt;br/&gt;&nbsp; <br>&lt;iro:lacksPermission&gt;&nbsp; <br><br></p></div><div class="last-item"><span class="last-item-end">END</span></div></li></ol></div></div>javascript

相關文章
相關標籤/搜索