shiro使用註解式和jsp標籤的方式進行開發
阿新 • • 發佈:2019-01-01
原先的時候可以使用url的shiro配置方式進行攔截,但是發現url地址過多會配置繁瑣,解決的方式就是使用aop註解式和jsp標籤進行開發
原來的方式
變成註解式<!-- Shiro許可權過濾過濾器定義 --> <bean name="shiroFilterChainDefinitions" class="java.lang.String"> <!-- 每個標籤都是對應一個過濾器 比如anno對應的就是AnonymousFilter --> <constructor-arg> <value> ${adminPath}/sysindex.html = anon /static/** = anon <!-- 對應某個連結需要某個許可權 取消這種url使用AOP註解 ${adminPath}/queryArea.do = perms[items:query] --> ${adminPath}/login = authc <!-- 請求這個地址直接退出並清除session --> ${adminPath}/logout = logout ${adminPath}/** = user </value> </constructor-arg> </bean>
@RequiresPermissions("sys:menu:save")
@RequestMapping(value = "save")
public void save(Menu menu, Model model, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
那麼這個Permission是怎麼進行設定的呢
答案在授權方法中
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { //返回什麼值是必須要和doGetAuthenticationInfo的第一個引數有關的 Principal principal = (Principal) getAvailablePrincipal(principals); // 獲取當前已登入的使用者 /* if (!PublicConstant.TRUE.equals(Global.getConfig("user.multiAccountLogin"))){ Collection<Session> sessions = cachingShiroSessionDao.getActiveSessions(true, principal, SysUtils.getSession()); if (sessions.size() > 0){ // 如果是登入進來的,則踢出已線上使用者 if (SysUtils.getSubject().isAuthenticated()){ for (Session session : sessions){ cachingShiroSessionDao.delete(session); } } // 記住我進來的,並且當前使用者已登入,則退出當前使用者提示資訊。 else{ SysUtils.getSubject().logout(); throw new AuthenticationException("msg:賬號已在其它地方登入,請重新登入。"); } } }*/ try{ User user = userService.get(new User(principal.getLoginName())); if (user != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //加入許可權即可以在jsp和java類中呼叫 // List<Menu> list = SysUtils.getRoleMenu(); // for (Menu menu : list){ // if (StringUtils.isNotBlank(menu.getPermission())){ // // 新增基於Permission的許可權資訊 // for (String permission : StringUtils.split(menu.getPermission(),",")){ // info.addStringPermission(permission); // } // } // } // 新增使用者許可權 info.addStringPermission("user"); // 更新登入IP和時間 // iUserApi.updateUserLoginInfo(user); // 記錄登入日誌 // LogUtils.saveLog(Servlets.getRequest(), "系統登入"); return info; } }catch(Exception e){ logger.error("DEMO 報錯-位置:[SystemAuthorizingRealm->doGetAuthorizationInfo]",e); } return null; }
info.addStringPermission(permission);
這樣就完成了對應
spring開啟aop 兩種配置方式
<!-- AOP式方法級許可權檢查 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"> <property name="proxyTargetClass" value="true" /> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
<!-- 開啟aop,對類代理 -->
<aop:config proxy-target-class="true"></aop:config>
<!-- 開啟shiro註解支援 -->
<bean
class="
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>
用一種即可
jsp標籤
Jsp頁面新增:
<%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>或者自定義shiro標籤
標籤名稱 |
標籤條件(均是顯示標籤內容) |
<shiro:authenticated> |
登入之後 |
<shiro:notAuthenticated> |
不在登入狀態時 |
<shiro:guest> |
使用者在沒有RememberMe時 |
<shiro:user> |
使用者在RememberMe時 |
<shiro:hasAnyRoles name="abc,123" > |
在有abc或者123角色時 |
<shiro:hasRole name="abc"> |
擁有角色abc |
<shiro:lacksRole name="abc"> |
沒有角色abc |
<shiro:hasPermission name="abc"> |
擁有許可權資源abc |
<shiro:lacksPermission name="abc"> |
沒有abc許可權資源 |
<shiro:principal> |
<shiro:principal property="username"/> 顯示使用者身份中的屬性值
注意:無論是jsp還是aop都會每次都呼叫realm進行訪問資料庫獲取許可權資訊