1. 程式人生 > >shiro使用註解式和jsp標籤的方式進行開發

shiro使用註解式和jsp標籤的方式進行開發

原先的時候可以使用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進行訪問資料庫獲取許可權資訊