freemarker集成shiro標籤

 

本身寫的案例在github上   能夠下載下來看

https://github.com/171437912/shiro_ssm_Demo.gitjava

freemarker集成shiro標籤

最近在作權限控制的時候用到了shiro,惋惜一竅不通,學了一段時間以後,在freemarker裝飾器中集成shiro標籤時遇到了一點問題,網上資料都是在普通頁面實現,特此記錄下,若有理解不對的地方還請各位指正。
一、須要引入jar包,或者到github上下載源碼打包使用(也能夠實現本身特定需求): https://github.com/zhoushuaichang/shiro-freemarker-tags
 
二、集成freemarker的配置類FreeMarkerConfigurer,重寫afterPropertiesSet()方法:以下
import com.jagregory.shiro.freemarker.ShiroTags;
import freemarker.template.TemplateException;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import java.io.IOException;

/**
* 繼承FreeMarkerConfigurer類,重寫afterPropertiesSet()方法;
* 集成shiroTags標籤
* Created by zsc on 2016/1/5.
*/
public class ShiroTagFreeMarkerConfigurer extends FreeMarkerConfigurer {

@Override
public void afterPropertiesSet() throws IOException, TemplateException {
super.afterPropertiesSet();
this.getConfiguration().setSharedVariable("shiro", new ShiroTags());
}

}
三、修改freemarker的xml配置文件:把freemarkerConfig bean的class指向自定義的ShiroTagFreeMarkerConfigurer,以下
<!--<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">-->
<bean id="freemarkerConfig" class="com.***.shiro.tag.ShiroTagFreeMarkerConfigurer">
<!--shiro標籤僅限用在該路徑下的ftl頁面,不能使用include引入-->
   <property name="templateLoaderPath" value="/WEB-INF/viewftl/" /> 
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">utf-8</prop>
<prop key="number_format">\#0.\#\#\#\#\#</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
<!--<prop key="auto_import">/common/page.ftl as p</prop>-->
<!--<prop key="auto_include">/common/page.ftl</prop>-->
</props>
</property>
</bean>
四、包含如下標籤
     guest標籤:驗證當前用戶是否爲「訪客」,即未認證(包含未記住)的用戶;shiro標籤:<shiro:guest></shiro:guest>  ;freemark中: <@shiro.guest>  </@shiro.guest> 
     user標籤:認證經過或已記住的用戶 shiro標籤:<shiro:user> </shiro:user>  ;freemark中: <@shiro.user> </@shiro.user> 
     authenticated標籤:已認證經過的用戶。不包含已記住的用戶,這是與user標籤的區別所在。 shiro標籤:<shiro:authenticated> </shiro:authenticated>;freemark中: <@shiro.authenticated></@shiro.authenticated>
     notAuthenticated標籤:未認證經過的用戶。與authenticated標籤相對。 shiro標籤:<shiro:notAuthenticated> </shiro:notAuthenticated>;freemark中: <@shiro.notAuthenticated></@shiro.notAuthenticated>
     principal標籤:輸出當前用戶信息,一般爲登陸賬號信息  shiro標籤:Hello,  <@shiro.principal property="name" />  ;freemarker中:  Hello,  <@shiro.principal property="name" />, how are you today?     
     hasRole標籤:驗證當前用戶是否屬於該角色 ,shiro標籤: <shiro:hasRole name="administrator">  Administer the system </shiro:hasRole> ;freemarker中:<@shiro.hasRole name=」admin」>Hello admin!</@shiro.hasRole> 
     hasAnyRoles標籤:驗證當前用戶是否屬於這些角色中的任何一個,角色之間逗號分隔 ,shiro標籤: <shiro:hasAnyRoles name="admin,user,operator">  Administer the system </shiro:hasAnyRoles> ;freemarker中:<@shiro.hasAnyRoles name="admin,user,operator">Hello admin!</@shiro.hasAnyRoles>
     hasPermission標籤:驗證當前用戶是否擁有該權限 ,shiro標籤: <shiro:hasPermission name="/order:*">  訂單 </shiro:hasPermission> ;freemarker中:<@shiro.hasPermission name="/order:*">訂單/@shiro.hasPermission> 
     lacksRole標籤:驗證當前用戶不屬於該角色,與hasRole標籤想反,shiro標籤: <shiro:hasRole name="admin">  Administer the system </shiro:hasRole> ;freemarker中:<@shiro.hasRole name="admin">Hello admin!</@shiro.hasRole> 
     lacksPermission標籤:驗證當前用戶不擁有某種權限,與hasPermission標籤是相對的,shiro標籤: <shiro:lacksPermission name="/order:*"> trade </shiro:lacksPermission> ;freemarker中:<@shiro.lacksPermission name="/order:*">trade</@shiro.lacksPermission> 
    
五、 注意:此狀況只是對沒有使用sitemesh有效,若freemarker使用了裝飾器模板來對返回頁面進行裝飾,這些標籤只能用在返回的ftl頁面中,而不能用在模板ftl中,include引入的會解析不了。
 
 
解決上述問題,能夠經過修改freemarker的重寫覆蓋源碼的Configuration類來實現,這樣作的話不只能夠實現上述集成的效果,並且還避免的裝飾頁面不生效的問題,具體作法以下:
一、將 freemarker.template.Configuration.java中的源碼複製到項目中,包命名和類命名與之徹底相同,修改本身複製後的類中loadBuiltInSharedVariables()方法,添加sharedVariables.put("shiro", new ShiroTags());,以下:ShiroTags是上述shiro-freemarker-tags.jar中定義的。
 
二、修改web.xml文件,以下,紅色字體是須要在shiroFilter中配置的,由於動態請求頁面中的標籤是經過REQUEST獲取的,而靜態裝飾頁面中的標籤是經過FORWARD或者INCLUDE獲取的,不然在解析標籤時獲取不到當前用戶的subject信息。另外,shiroFilter建議配置在sitemesh以前。
 <!-- shiro 安全過濾器 -->   <filter>       <filter-name>shiroFilter</filter-name>       <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>       <async-supported>true</async-supported>       <init-param>           <param-name>targetFilterLifecycle</param-name>           <param-value>true</param-value>       </init-param>   </filter>   <filter-mapping>       <filter-name>shiroFilter</filter-name>       <url-pattern>*.htm</url-pattern>       <dispatcher>REQUEST</dispatcher>       <dispatcher>FORWARD</dispatcher>       <dispatcher>INCLUDE</dispatcher>   </filter-mapping>   <!-- sitemesh 裝飾配置 -->   <filter>       <filter-name>sitemesh</filter-name>       <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>   </filter>   <filter-mapping>       <filter-name>sitemesh</filter-name>       <url-pattern>/*</url-pattern>   </filter-mapping>
相關文章
相關標籤/搜索