我正在使用Thymeleaf的弹簧安全装置。在HTML代码中,我正在检查用户角色:
<li class="has-sub" sec:authorize="hasRole('ROLE_ADMIN')">
</li>
但在春天我实现了自己的CustomSecurityExpressionRoot
,所以我可以在控制器中使用例如
@PreAuthorize("hasAccess('PERMISSION')")
有可能连接Thymeleaf能够使用hasAccess
中的CustomSecurityExpressionRoot
(和其他)方法吗?
我会把逻辑放在一个单独的Spring bean中:
@Component
public class AccessEvaluator {
public boolean hasAccess(Authentication authentication, String permission) {
// implementation
}
}
然后在Thymeleaf代码中:
<li th:if="${@accessEvaluator.hasAccess(#request.userPrincipal, 'PERMISSION')}">
</li>
我使用类似于发布的答案的方式获得身份验证:
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
@Component
public class AccessEvaluator {
public boolean hasAccess(String pageName) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
return ((MyUserPrincipal) auth.getPrincipal()).getAccessOnPage(pageName);
}
}
并将其命名如下:
<li th:if="${@accessEvaluator.hasAccess('ACT')}" >
<p> I have access on ACT page </p>
</li>