Freemarker 的 Shiro 标签使用详解

时间:2023-03-08 22:02:13

一、引入依赖(已解决版本冲突)

<!-- shiro-freemarker-tags start -->
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
</exclusion>
<exclusion>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- shiro-freemarker-tags end --> <!-- freemarker start -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- freemarker end --> <!-- shiro begin -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.4.0</version>
</dependency>
<!-- shiro end -->

二、配置

Java代码:

public class FreeMarkerConfigExtend extends FreeMarkerConfigurer {
@Override
public void afterPropertiesSet() throws IOException, TemplateException {
super.afterPropertiesSet();
Configuration cfg = this.getConfiguration();
// 添加shiro标签
cfg.setSharedVariable("shiro", new ShiroTags());
}
}
<!-- freemarker环境配置 -->
<bean id="freemarkerConfig" class="com.demo.shiro.common.freemarker.FreeMarkerConfigExtend">
<!-- 模版位置,这里配置了下面就不用配了 -->
<property name="templateLoaderPath" value="/WEB-INF/views" />
<property name="freemarkerSettings"><!-- 一些设置 -->
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.##########</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
<prop key="auto_import">
<!-- 自动装载,引入Freemarker,用于Freemarker Macro引入 -->
/common/_meta.ftl as _meta,
/common/_footer.ftl as _footer
<!--/common/menu.ftl as _menu-->
</prop>
</props>
</property>
</bean>

三、shiro标签详解

1. guest(游客)

<@shiro.guest>
您当前是游客,<a href="javascript:void(0);">登录</a>
</@shiro.guest>

2. user(已经登录,或者记住我登录)

<@shiro.user>
欢迎[<@shiro.principal/>]登录,<a href="/logout.shtml">退出</a>
</@shiro.user>

3. authenticated(已经认证,排除记住我登录的)

<@shiro.authenticated>
用户[<@shiro.principal/>]已身份验证通过
</@shiro.authenticated>

4. notAuthenticated(和authenticated相反)

<@shiro.notAuthenticated>
当前身份未认证(包括记住我登录的)
</@shiro.notAuthenticated>

该功能主要用途:识别是不是本次操作登录过的,比如支付系统,进入系统可以用记住我的登录信息,但是当要关键操作的时候,需要进行认证识别。

5. principal标签

principal标签,取值取的是你登录的时候。在Realm实现类中的如下代码:

...
return new SimpleAuthenticationInfo(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>

原文地址:https://www.sojson.com/blog/143.html