Shiro + SSM(框架) + Freemarker(jsp)講解的許可權控制
阿新 • • 發佈:2019-01-24
Shiro 提供了JSP
的一套JSTL
標籤,用於做JSP
頁面做許可權控制的。可以控制一些按鈕和一些超連結,或者一些顯示內容。JSP
的下篇文章會講到,這篇先講講 Freemarker 的 Shiro 標籤。
引用包:
<!-- freemarker + shiro(標籤) begin -->
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>0.1</version>
</dependency>
<!-- freemarker + shiro(標籤) begin -->
他不是 shiro 官方提供的。如果不是 Maven 專案,請在下方附件內提取。
Java程式碼:
publicclassFreeMarkerConfigExtendextendsFreeMarkerConfigurer{
@Override
publicvoid afterPropertiesSet()throwsIOException,TemplateException{
super.afterPropertiesSet();
Configuration cfg =
cfg.setSharedVariable("shiro",newShiroTags());//shiro標籤
cfg.setNumberFormat("#");//防止頁面輸出數字,變成2,000
//可以新增很多自己的要傳輸到頁面的[方法、物件、值]
}
}
配置檔案:
<!-- 配置freeMarker 拓展-->
<beanid="freemarkerConfig"
class="com.sojson.core.freemarker.extend.FreeMarkerConfigExtend">
<property
<value>/WEB-INF/ftl/</value>
</property>
<propertyname="freemarkerVariables">
<map>
<entrykey="xml_escape"value-ref="fmXmlEscape"/>
<entrykey="api"value-ref="api"/>
</map>
</property>
<propertyname="defaultEncoding">
<value>utf-8</value>
</property>
<propertyname="freemarkerSettings">
<props><!-- 315360000 -->
<propkey="template_update_delay">0</prop>
<propkey="defaultEncoding">UTF-8</prop>
<propkey="url_escaping_charset">UTF-8</prop>
<propkey="locale">zh_CN</prop>
<propkey="boolean_format">true,false</prop>
<propkey="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<propkey="date_format">yyyy-MM-dd</prop>
<propkey="time_format">HH:mm:ss</prop>
<!-- <prop key="number_format">0.######</prop>-->
<propkey="number_format">#</prop>
<propkey="whitespace_stripping">true</prop>
<propkey="auto_import">
/common/config/top.ftl as _top,
/common/config/left.ftl as _left,
/common/config/html.ftl as _html,
/common/config/bottom.ftl as _footer,
/common/config/menu.ftl as _menu
</prop>
</props>
</property>
</bean>
下面來介紹標籤:
1.guest(遊客)
<@shiro.guest>
您當前是遊客,<ahref="javascript:void(0);"class="dropdown-toggle qqlogin">登入</a>
</@shiro.guest>
2.user(已經登入,或者記住我登入)
<@shiro.user>
歡迎[<@shiro.principal/>]登入,<ahref="/logout.shtml">退出</a>
</@shiro.user>
3.authenticated(已經認證,排除記住我登入的)
<@shiro.authenticated>
使用者[<@shiro.principal/>]已身份驗證通過
</@shiro.authenticated>
4.notAuthenticated(和authenticated相反)
<@shiro.notAuthenticated>
當前身份未認證(包括記住我登入的)
</@shiro.notAuthenticated>
這個功能主要用途,識別是不是本次操作登入過的,比如支付系統,進入系統可以用記住我的登入資訊,但是當要關鍵操作的時候,需要進行認證識別。
5.principal標籤,這個要稍微重點講講。好多部落格都是一下帶過。
principal標籤,取值取的是你登入的時候。在Realm實現類中的如下程式碼:
....
returnnewSimpleAuthenticationInfo(user,user.getPswd(), getName());
在new SimpleAuthenticationInfo(第一個引數,....)的第一個引數放的如果是一個username,那麼就可以直接用。
<!--取到username-->
<@shiro. principal/>
如果第一個引數放的是物件,比如我喜歡放User物件。那麼如果要取username欄位。
<!--需要指定property-->
<@shiro.principal property="username"/>
和Java如下Java程式碼一致
User user =(User)SecurityUtils.getSubject().getPrincipals();
String username = user.getUsername();
6.hasRole標籤(判斷是否擁有這個角色)
<@shiro.hasRole name="admin">
使用者[<@shiro.principal/>]擁有角色admin<br/>
</@shiro.hasRole>
7.hasAnyRoles標籤(判斷是否擁有這些角色的其中一個)
<@shiro.hasAnyRoles name="admin,user,member">
使用者[<@shiro.principal/>]擁有角色admin或user或member<br/>
</@shiro.hasAnyRoles>
8.lacksRole標籤(判斷是否不擁有這個角色)
<@shiro.lacksRole name="admin">
使用者[<@shiro.principal/>]不擁有admin角色
</@shiro.lacksRole>
9.hasPermission標籤(判斷是否有擁有這個許可權)
<@shiro.hasPermission name="user:add">
使用者[<@shiro.principal/>]擁有user:add許可權
</@shiro.hasPermission>
10.lacksPermission標籤(判斷是否沒有這個許可權)
<@shiro.lacksPermission name="user:add">
使用者[<@shiro.principal/>]不擁有user:add許可權
</@shiro.lacksPermission>