一、引入依赖(已解决版本冲突) 复制代码 <!-- 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>