1. 程式人生 > >Shiro + SSM(框架) + Freemarker(jsp)講解的許可權控制

Shiro + SSM(框架) + Freemarker(jsp)講解的許可權控制

Shiro  提供了JSP的一套JSTL標籤,用於做JSP頁面做許可權控制的。可以控制一些按鈕和一些超連結,或者一些顯示內容。JSP的下篇文章會講到,這篇先講講 Freemarker   Shiro  標籤。

引用包:

  1. <!-- freemarker + shiro(標籤) begin -->
  2. <dependency>
  3. <groupId>net.mingsoft</groupId>
  4. <artifactId>shiro-freemarker-tags</artifactId>
  5. <version>0.1</version>
  6. </dependency>
  7. <!-- freemarker + shiro(標籤) begin -->

他不是 shiro  官方提供的。如果不是 Maven  專案,請在下方附件內提取。

Java程式碼:

  1. publicclassFreeMarkerConfigExtendextendsFreeMarkerConfigurer{
  2. @Override
  3. publicvoid afterPropertiesSet()throwsIOException,TemplateException{
  4. super.afterPropertiesSet();
  5. Configuration cfg =
    this.getConfiguration();
  6. cfg.setSharedVariable("shiro",newShiroTags());//shiro標籤
  7. cfg.setNumberFormat("#");//防止頁面輸出數字,變成2,000
  8. //可以新增很多自己的要傳輸到頁面的[方法、物件、值]
  9. }
  10. }

配置檔案:

  1. <!-- 配置freeMarker 拓展-->
  2. <beanid="freemarkerConfig"
  3. class="com.sojson.core.freemarker.extend.FreeMarkerConfigExtend">
  4. <property
    name="templateLoaderPath">
  5. <value>/WEB-INF/ftl/</value>
  6. </property>
  7. <propertyname="freemarkerVariables">
  8. <map>
  9. <entrykey="xml_escape"value-ref="fmXmlEscape"/>
  10. <entrykey="api"value-ref="api"/>
  11. </map>
  12. </property>
  13. <propertyname="defaultEncoding">
  14. <value>utf-8</value>
  15. </property>
  16. <propertyname="freemarkerSettings">
  17. <props><!-- 315360000 -->
  18. <propkey="template_update_delay">0</prop>
  19. <propkey="defaultEncoding">UTF-8</prop>
  20. <propkey="url_escaping_charset">UTF-8</prop>
  21. <propkey="locale">zh_CN</prop>
  22. <propkey="boolean_format">true,false</prop>
  23. <propkey="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
  24. <propkey="date_format">yyyy-MM-dd</prop>
  25. <propkey="time_format">HH:mm:ss</prop>
  26. <!-- <prop key="number_format">0.######</prop>-->
  27. <propkey="number_format">#</prop>
  28. <propkey="whitespace_stripping">true</prop>
  29. <propkey="auto_import">
  30. /common/config/top.ftl as _top,
  31. /common/config/left.ftl as _left,
  32. /common/config/html.ftl as _html,
  33. /common/config/bottom.ftl as _footer,
  34. /common/config/menu.ftl as _menu
  35. </prop>
  36. </props>
  37. </property>
  38. </bean>

下面來介紹標籤:

1.guest(遊客)

  1. <@shiro.guest>
  2. 您當前是遊客,<ahref="javascript:void(0);"class="dropdown-toggle qqlogin">登入</a>
  3. </@shiro.guest>

2.user(已經登入,或者記住我登入)

  1. <@shiro.user>
  2. 歡迎[<@shiro.principal/>]登入,<ahref="/logout.shtml">退出</a>
  3. </@shiro.user>

3.authenticated(已經認證,排除記住我登入的)

  1. <@shiro.authenticated>
  2. 使用者[<@shiro.principal/>]已身份驗證通過
  3. </@shiro.authenticated>

4.notAuthenticated(和authenticated相反)

  1. <@shiro.notAuthenticated>
  2. 當前身份未認證(包括記住我登入的)
  3. </@shiro.notAuthenticated>

這個功能主要用途,識別是不是本次操作登入過的,比如支付系統,進入系統可以用記住我的登入資訊,但是當要關鍵操作的時候,需要進行認證識別。

5.principal標籤,這個要稍微重點講講。好多部落格都是一下帶過。

principal標籤,取值取的是你登入的時候。在Realm實現類中的如下程式碼:

  1. ....
  2. returnnewSimpleAuthenticationInfo(user,user.getPswd(), getName());

在new SimpleAuthenticationInfo(第一個引數,....)的第一個引數放的如果是一個username,那麼就可以直接用。

  1. <!--取到username-->
  2. <@shiro. principal/>

如果第一個引數放的是物件,比如我喜歡放User物件。那麼如果要取username欄位。

  1. <!--需要指定property-->
  2. <@shiro.principal property="username"/>

和Java如下Java程式碼一致

  1. User user =(User)SecurityUtils.getSubject().getPrincipals();
  2. String username = user.getUsername();

6.hasRole標籤(判斷是否擁有這個角色)

  1. <@shiro.hasRole name="admin">
  2. 使用者[<@shiro.principal/>]擁有角色admin<br/>
  3. </@shiro.hasRole>

7.hasAnyRoles標籤(判斷是否擁有這些角色的其中一個)

  1. <@shiro.hasAnyRoles name="admin,user,member">
  2. 使用者[<@shiro.principal/>]擁有角色admin或user或member<br/>
  3. </@shiro.hasAnyRoles>

8.lacksRole標籤(判斷是否不擁有這個角色)

  1. <@shiro.lacksRole name="admin">
  2. 使用者[<@shiro.principal/>]不擁有admin角色
  3. </@shiro.lacksRole>

9.hasPermission標籤(判斷是否有擁有這個許可權)

  1. <@shiro.hasPermission name="user:add">
  2. 使用者[<@shiro.principal/>]擁有user:add許可權
  3. </@shiro.hasPermission>

10.lacksPermission標籤(判斷是否沒有這個許可權)

  1. <@shiro.lacksPermission name="user:add">
  2. 使用者[<@shiro.principal/>]不擁有user:add許可權
  3. </@shiro.lacksPermission>