Spring Security+;JSF角色驱动的页面组件呈现(链接等)最佳实践

Spring Security+;JSF角色驱动的页面组件呈现(链接等)最佳实践,jsf,hyperlink,spring-security,authorization,Jsf,Hyperlink,Spring Security,Authorization,usignjsf+Spring安全性 解决方案1-面向用户界面: JSF页面显示用户面板,如果经过身份验证的人员仅具有ROLE\u ADMIN权限 <p:panel rendered="#{facesContext.externalContext.isUserInRole('ROLE_ADMIN')}"> ... ... 解决方案2-面向后端的(注释适当的DAO方法): @Transactional @预授权(“hasRole('ROLE_ADMIN')) 公共列表getUse

usignjsf+Spring安全性

解决方案1-面向用户界面:
JSF
页面显示用户面板,如果经过身份验证的人员仅具有
ROLE\u ADMIN
权限

<p:panel rendered="#{facesContext.externalContext.isUserInRole('ROLE_ADMIN')}">
...

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

@Transactional
@预授权(“hasRole('ROLE_ADMIN'))
公共列表getUsers(){
返回sessionFactory.getCurrentSession().createCriteria(User.class)
.list();
}
继续:
看起来JSF
rendered
属性不是灵活的解决方案,DAO注释的方法不是用户友好的,因为重定向到
403


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

Spring Security(取决于它的配置)将在用户无权访问特定资源的情况下返回403或重定向


解决方案1是实现您试图实现的目标的适当方法,但实际上您在FacesContext和您的视图之间创建了一个依赖关系,我认为这是一种糟糕的做法。更好的解决方案是将此授权逻辑封装在托管bean属性中。这样做的好处是您的视图不再依赖于您的授权实现,并且您的托管bean现在适当地包含了这种依赖关系。

您不希望显示最终用户面板或任何类型的功能,这些功能无论如何都不允许最终用户查看/使用。这只会导致普遍的混乱和沮丧。因此,在
rendered
属性中进行角色检查是一种方法

该表达式只能以以下形式进行简化:

<p:panel rendered="#{request.isUserInRole('ROLE_ADMIN')}">


委托给,但是
HttpServletRequest
本身也作为
#{request}

出现在EL范围中,为什么JSF呈现的属性“不灵活”?这似乎是您的正确解决方案,尽管特定的EL表达式可以更加简化。我不知道确切情况-这是我自己的感觉。我的意思是,当角色集更改时,您应该更改
.xhtml
alsoBalusC,如何简化EL?据我所知,无论如何都应该使用
rendered
?但它会隐藏有关用户角色的声明,例如:rendered='“#{securedProxy.rolesEnum}”我是否正确?以及
securedProxy
是bean,它是关于当前登录用户的。@sergionni是的,这是正确的。BalusC的答案比我的答案更清楚。
<p:panel rendered="#{request.isUserInRole('ROLE_ADMIN')}">