freemarker使用shiro标签(spring boot)

首先需要写一个类

/**
 * 集成Shiro标签
 */
@Component
public class ShiroTagFreeMarkerConfigurer implements InitializingBean {

	@Autowired
	private Configuration configuration;

	@Autowired
	private FreeMarkerViewResolver resolver;

	@Override
	public void afterPropertiesSet() throws Exception {
		// 加上这句后,可以在页面上使用shiro标签
		configuration.setSharedVariable("shiro", new ShiroTags());
		// 加上这句后,可以在页面上用${context.contextPath}获取contextPath
		resolver.setRequestContextAttribute("context");
	}
}

然后在doGetAuthorizationInfo方法中获取我们想要验证的权限,将权限写入roleNames和PermissionNames中

	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
		logger.info("执行Shiro权限认证");
		try {
			UserInfo user = (UserInfo) SecurityUtils.getSubject().getPrincipal();
			if (user != null) {
				// 权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)
				SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
				
				// 根据用户名id查询xxx权限
				List<XXX> xxxList = xxxWSService.findxxxbyUserInfoId(user.getId());
				
				Set<String> roleNames = new HashSet<String>();
				Set<String> permissionNames = new HashSet<String>();
				for (XXX xxx: xxxList) {
					permissionNames.add(Constants.SHIRO_AUTH_XXX + "_" + xxx.getxxxId().toString());
					roleNames.add(Constants.SHIRO_AUTH_XXX + "_" + xxx.getxxxId().toString() + "_" + xxx.getXxxName().toString());
				}
				
				// 将权限提供给info
		                info.setStringPermissions(permissionNames);
				// 将角色名称提供给info
		                info.setRoles(roleNames);
				
				info.addStringPermission("");
				return info;
			}
			
		} catch (Exception e) {
			logger.error("执行Shiro权限认证异常!", e.getLocalizedMessage() );
			e.printStackTrace();
			return null;
		}
		// 返回null的话,就会导致任何用户访问被拦截的请求时,都会自动跳转到unauthorizedUrl指定的地址
		return null;
	}

最后就可以在前端freemarker模板中使用shiro标签,有xxx角色的人员才可以看到"保存"按钮;

<@shiro.hasAnyRoles name="app_${xxx.id?c}_1,app_${xxx.id?c}_2">
	<button type="submit"class="btn green" style="padding:6px 22px">保 存</button>
</@shiro.hasAnyRoles>

Shiro包含的标签:

    guest标签:验证当前用户是否为“访客”,即未认证(包含未记住)的用户; shiro标签:<shiro:guest> </shiro:guest>  ; freemark中: <@shiro.guest>   </@shiro.guest> 
    user标签:认证通过或已记住的用户 shiro标签:<shiro:user> </shiro:user>  ;freemark中: <@shiro.user> </@shiro.user> 
      authenticated标签:已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。 shiro标签: <shiro:authenticated>  </shiro:authenticated>; freemark中:  <@shiro.authenticated> </@shiro.authenticated>
    notAuthenticated标签:未认证通过的用户。与authenticated标签相对。 shiro标签:<shiro:notAuthenticated> </shiro:notAuthenticated>;freemark中: <@shiro.notAuthenticated></@shiro.notAuthenticated>
     principal标签 输出当前用户信息,通常为登录帐号信息  shiro标签: Hello,  <@shiro.principal property="name" />  ; freemarker中:   Hello,  <@shiro.principal property="name" />, how are you today?     
     hasRole标签 :验证当前用户是否属于该角色 ,shiro标签:  <shiro:hasRole name="administrator">   Administer the system  </shiro:hasRole> ; freemarker中: <@shiro.hasRole name=”admin”>Hello admin!</@shiro.hasRole> 
      hasAnyRoles标签验证当前用户是否属于这些角色中的任何一个,角色之间逗号分隔 ,shiro标签:  <shiro:hasAnyRoles name="admin,user,operator">   Administer the system  </shiro:hasAnyRoles> ; freemarker中: <@shiro.hasAnyRoles name="admin,user,operator">Hello admin!</@shiro.hasAnyRoles>
      hasPermission标签验证当前用户是否拥有该权限 ,shiro标签:  <shiro:hasPermission name="/order:*">   订单  </shiro:hasPermission> ; freemarker中: <@shiro.hasPermission name="/order:*">订单/@shiro.hasPermission
     lacksRole标签 :验证当前用户不属于该角色,与hasRole标签想反,shiro标签: <shiro:hasRole name="admin">  Administer the system </shiro:hasRole> ;freemarker中:<@shiro.hasRole name="admin">Hello admin!</@shiro.hasRole> 
      lacksPermission标签:验证当前用户不拥有某种权限,与hasPermission标签是相对的, shiro标签:  <shiro:lacksPermission name="/order:*">  trade  </shiro:lacksPermission> ; freemarker中: <@shiro.lacksPermission name="/order:*">trade</@shiro.lacksPermission




猜你喜欢

转载自blog.csdn.net/sayoko06/article/details/80897658