1、在工程中引入对应包信息
下面的包为thymeleaf中使用shiro的包,如果你的项目需要使用其他包,自信导入,如shiro的包等。
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>${thymeleaf-shiro.version}</version>
</dependency>
2、创建shiro配置类Shiroconfig
重点说明:需要引入shiro的方言配置,否则shiro标签在thymeleaf中会失效
解决问题:解决shiro标签在thymeleaf中无效问题
@Configuration
public class ShiroConfig {
/**
* 开启shiro aop 注解支持. 否则注解不生效
* 使用代理方式;所以需要开启代码支持;
* @return
*/
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
@Bean
@DependsOn({"lifecycleBeanPostProcessor"})
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
//ShiroFilter过滤所有请求
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
System.out.println("==============执行shiro自定义filter===============");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//给ShiroFilter配置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//配置系统受限资源
//配置系统公共资源
Map<String, String> map = new HashMap<String, String>();
//map.put("/user/login","anon");//表示这个为公共资源 一定是在受限资源上面
//map.put("/**","authc");//表示这个受限资源需要认证和授权
// 设置认证界面路径
//shiroFilterFactoryBean.setLoginUrl("/login.html");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
//创建安全管理器
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm) {
System.out.println("============加载安全管理器===============");
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
//创建自定义Realm
@Bean
public Realm getRealm() {
System.out.println("==============加载自定义realm===============");
return new LoginRealm();
}
//加方言,否则shiro在html标签不生效
@Bean(name = "shiroDialect")
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}
3、shiro标签简介
用于 Apache Shiro 的 JSP/GSP 标签库
<shiro:guest/>
仅当系统不知道当前主题时,才会显示正文内容,因为他们尚未登录或没有相应的“记住我”身份。 它在逻辑上与“用户”标签相反。
<shiro:user/>
仅当当前主体具有已知身份(来自以前的登录或“RememberMe”服务)时,才显示正文内容。 请注意,这在语义上与“经过身份验证”标记不同,后者更具限制性。 它在逻辑上与“guest”标签相反。
<shiro:principal/>
显示用户的主体或用户主体的属性。
<shiro:hasPermission/>
仅当当前主体(用户)“具有”(暗示)指定权限(即用户具有指定能力)时才显示正文内容。
<shiro:lacksPermission/>
仅当当前主体(用户)没有(不暗示)指定权限(即用户缺乏指定的能力)时才显示正文内容。
<shiro:hasRole/>
仅当当前用户具有指定角色时才显示正文内容。
<shiro:lacksRole/>
仅当当前用户没有指定角色(即他们明确缺少指定角色)时才显示正文内容。
<shiro:hasAnyRoles/>
仅当当前用户具有逗号分隔的角色名称列表中的指定角色之一时,才显示正文内容。
<shiro:已验证/>
仅当当前用户在其当前会话期间成功进行身份验证时,才显示正文内容。 它比“用户”标签更具限制性。 它在逻辑上与“未认证”标签相反。
<shiro:notAuthenticated/>
仅当当前用户在其当前会话期间未成功进行身份验证时,才显示正文内容。 它在逻辑上与“经过身份验证”的标签相反。
4、在页面中使用shiro标签
shiro:hasAllRoles="2001":如果有2001这个角色就显示李
shiro:hasPermission="goods:findgoods":如果有goods:findgoods权限就显示li
重点说明,shiro标签在thymeleaf中直接作为标签的一个属性使用即可。
<!DOCTYPE html>
<html xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<title>thymeleaf-extras-shiro</title>
</head>
<body>
<p shiro:guest="">Please <a href="login.html">login</a></p>
<p shiro:authenticated="">
Hello, <span shiro:principal=""></span>, how are you today?
</p>
<li shiro:hasAllRoles="2001">商品管理
<ul>
<li shiro:hasPermission="goods:findgoods"> 查看商品信息</li>
<li shiro:hasPermission="goods:deleteuser">删除商品信息</li>
</ul>
</li>
</body>
</html>