Spring Security + JSF ROLE驱动的页面组件渲染(链接等)最佳实践

ser*_*nni 4 jsf authorization hyperlink spring-security

使用JSF + Spring Security.

解决方案1 ​​ - 面向UI:
JSF如果经过身份验证的人员ROLE_ADMIN仅具有权限,则页面将显示面板.

<p:panel rendered="#{facesContext.externalContext.isUserInRole('ROLE_ADMIN')}">
...
Run Code Online (Sandbox Code Playgroud)

解决方案2 - 面向后端(注释适当的DAO方法):

@Transactional
@PreAuthorize("hasRole('ROLE_ADMIN')")
public List<User> getUsers() {
    return sessionFactory.getCurrentSession().createCriteria(User.class)
            .list();
}
Run Code Online (Sandbox Code Playgroud)

简历:
看起来JSF rendered属性不是灵活的解决方案,DAO注释方法不是用户友好的,因为重定向到403.

什么是优雅的解决方案,允许我不显示与特定权限不对应的面板或链接?

Bal*_*usC 9

您不希望显示最终用户面板或最终用户不允许查看/使用的任何类型的功能.这只会导致一般的混乱和沮丧.因此,rendered属性中的角色检查是要走的路.

表达式只能以这种形式更简化:

<p:panel rendered="#{request.isUserInRole('ROLE_ADMIN')}">
Run Code Online (Sandbox Code Playgroud)

ExternalContext#isUserInRole()代表到HttpServletRequest#isUserInRole(),但HttpServletRequest其本身也存在于EL范围为#{request}.