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

相关文章
相关标签/搜索