防止用户角色执行操作。
- 示例1:角色"管理员"是唯一允许执行的角色摧毁行动
- 示例2:任何不同于"来宾"的角色都可以执行CREATE操作
在一个真实的案例中,我有这个:
public String delete() {
if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
//.....the action to perform
}
return "Denied";
}
我希望我可以使用EJB的注释@RolesAllowed()
,但我使用的不是EJB而是ManagedBean。所以问题是:有没有办法同时使用多个角色?一些变通方法!示例:如果一个操作必须允许3个角色(管理员、主持人、经理)执行。我必须做:
if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
|| FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager")
|| .....) {
//....
}
在所有的方法上复制是一种痛苦。类似于数百种方法:(
这需要在视图端进行控制。当你在某个网站上看到一个你没有足够权限按下的按钮,从而在这样做的时候得到一个令人生畏的错误页面时,你自己难道不觉得很烦人吗?
仅当用户具有所需角色时,才在视图侧渲染按钮,否则将其完全隐藏。
<h:commandButton value="Delete" action="#{bean.delete}"
rendered="#{request.isUserInRole('administrator')}" />
这对(CSRF)黑客攻击并不敏感,因为JSF在应用请求值阶段再次检查条件。
至于使用多个条件并在单个视图中反复重复相同的条件,请考虑使用<c:set>
为其提供一个短别名。您甚至可以将它放在某个主模板的顶部,以便所有子模板都可以使用它。
<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" />
...
<h:commandButton rendered="#{isPowerUser}" />
...
<h:commandButton rendered="#{isPowerUser}" />
您可以通过将逻辑移动到实用程序方法来缩短它:
public class AuthorizationUtils {
public static boolean isUserInRoles(String[] roles) {
for (String role : roles) {
if (FacesContext........isUserInRole(role)) {
return true;
}
}
return false;
}
}
然后调用它:
if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) {
..
}
如果您正在使用CDI,您可以制作一个拦截器来处理@RolesAllowed
注释
@Mediterran81:所以基本上你正在寻找基于bean方法的授权解决方案。。。您是如何实例化托管bean的?您可能想介绍一种简单的XML格式:-
<bean class="">
<method name="">
<role> xyz</role>
</method>
</bean>
让这个XML由实用工具类读取,然后只需要调用实用工具的静态方法来确定是否允许执行该方法。