我在哪里放@DeclareRoles?

时间:2015-02-13 14:05:42

标签: java security java-ee

我基本上理解@DeclareRoles@RolesAllowed的功能,但我不确定在哪里正确添加@DeclareRoles。我试着用ejb会话bean的vaadin应用程序和glassfish 4中的cdi。应用程序被打包成战争而不是耳朵。

  • @DeclareRoles 类:
    显然没有任何作用。 HttpServletRequest.isUserInRole()SessionContext.isCallerInRole()始终返回false。 @RolesAllowed始终拒绝访问。
  • Servlet上的
  • @DeclareRoles
    @RolesAllowedHttpServletRequest.isUserInRole()按预期工作。 SessionContext.isCallerInRole()总是返回false。
  • 会话bean上的
  • @DeclareRoles
    @RolesAllowedHttpServletRequest.isUserInRole()SessionContext.isCallerInRole()按预期工作。即使在与SessionContext.isCallerInRole()
  • 的会话bean不同的会话bean中调用@DeclareRoles

我现在的问题是:

  1. 放置@DeclareRoles的正确位置在哪里?
  2. 可以只设置一次,还是应该注释使用SessionContext.isCallerInRole()@RolesAllowed的每个bean?

1 个答案:

答案 0 :(得分:2)

可以在类和/或类的业务方法上指定方法权限。可以在bean类的方法上指定方法许可权,以覆盖在整个bean类上指定的方法许可权值。以下注释用于指定方法权限:

  • @DeclareRoles::指定应用程序将使用的所有角色,包括未在 @RolesAllowed 批注中特别命名的角色。应用程序使用的安全角色集是@DeclareRoles和 @RolesAllowed 批注中定义的所有安全角色。

@DeclareRoles 注释是在Bean类上指定的,该注释用于声明可从已注释类的方法内进行测试的角色(例如,通过调用isCallerInRole)。声明用作isCallerInRole(String roleName)方法的参数的角色的名称时,声明的名称必须与参数值相同。

以下示例代码演示了@DeclareRoles批注的用法:

@DeclareRoles("BusinessAdmin")
public class Calculator {
    ...
}

声明多个角色的语法如下例所示:

@DeclareRoles({"Administrator", "Manager", "Employee"})
  • @RolesAllowed(“角色列表”):指定允许访问应用程序中方法的安全角色。可以在类或一个或多个方法上指定此批注。在类级别指定时,注释将应用于该类中的所有方法。在方法上指定时,注释仅适用于该方法,并覆盖在类级别指定的所有值。

要指定没有角色有权访问应用程序中的方法,请使用@DenyAll批注。要指定有权使用任何角色的用户访问应用程序,请使用@PermitAll批注。

与@DeclareRoles批注结合使用时,应用程序将使用组合的安全角色集。

以下示例代码演示了 @RolesAllowed 注释的用法:

@DeclareRoles({"Administrator", "Manager", "Employee"})
public class Calculator {

    @RolesAllowed("Administrator")
    public void setNewRate(int rate) {
        ...
    }
}
  • @PermitAll :指定允许所有安全角色执行一个或多个指定方法。不会根据数据库检查用户,以确保他或她有权访问此应用程序。

可以在类或一个或多个方法上指定此批注。在类上指定此注释意味着它适用于该类的所有方法。在方法级别指定它意味着它仅适用于该方法。

以下示例代码演示了@PermitAll批注的用法:

import javax.annotation.security.*;
@RolesAllowed("RestrictedUsers")
public class Calculator {

    @RolesAllowed("Administrator")
    public void setNewRate(int rate) {
        //...
    }
    @PermitAll
    public long convertCurrency(long amount) {
        //...
    }
}
  • @DenyAll :指定不允许安全角色执行指定的方法。这意味着这些方法不会在Java EE容器中执行。

以下示例代码演示了@DenyAll批注的用法:

import javax.annotation.security.*;
@RolesAllowed("Users")
public class Calculator {
    @RolesAllowed("Administrator")
    public void setNewRate(int rate) {
        //...
    }
    @DenyAll
    public long convertCurrency(long amount) {
        //...
    }
}

以下代码片段演示了 @DeclareRoles 注释与 isCallerInRole 方法的结合使用。在此示例中, @DeclareRoles 注释通过使用isCallerInRole("payroll")验证调用者是否有权更改工资数据来声明企业bean PayrollBean用于进行安全检查的角色:

@DeclareRoles("payroll")
@Stateless 
public class PayrollBean implements Payroll {

    @Resource SessionContext ctx;

    public void updateEmployeeInfo(EmplInfo info) {

        oldInfo = ... read from database;

        // The salary field can be changed only by callers
        // who have the security role "payroll"
        Principal callerPrincipal = ctx.getCallerPrincipal();
        if (info.salary != oldInfo.salary && !ctx.isCallerInRole("payroll")) {
            throw new SecurityException(...);
        }
        ...
    }
    ...
}

以下示例代码说明了 @RolesAllowed 注释的用法:

@RolesAllowed("admin")
public class SomeClass {
    public void aMethod () {...}
    public void bMethod () {...}
    ...
}

@Stateless 
public class MyBean extends SomeClass implements A  {

    @RolesAllowed("HR")
    public void aMethod () {...}

    public void cMethod () {...}
    ...
}

更多信息:

Securing Enterprise Beans