我基本上理解@DeclareRoles
和@RolesAllowed
的功能,但我不确定在哪里正确添加@DeclareRoles
。我试着用ejb会话bean的vaadin应用程序和glassfish 4中的cdi。应用程序被打包成战争而不是耳朵。
@DeclareRoles
否类:HttpServletRequest.isUserInRole()
和SessionContext.isCallerInRole()
始终返回false。 @RolesAllowed
始终拒绝访问。@DeclareRoles
:@RolesAllowed
和HttpServletRequest.isUserInRole()
按预期工作。 SessionContext.isCallerInRole()
总是返回false。@DeclareRoles
:@RolesAllowed
,HttpServletRequest.isUserInRole()
和SessionContext.isCallerInRole()
按预期工作。即使在与SessionContext.isCallerInRole()
@DeclareRoles
我现在的问题是:
@DeclareRoles
的正确位置在哪里?SessionContext.isCallerInRole()
或@RolesAllowed
的每个bean?答案 0 :(得分:2)
可以在类和/或类的业务方法上指定方法权限。可以在bean类的方法上指定方法许可权,以覆盖在整个bean类上指定的方法许可权值。以下注释用于指定方法权限:
@DeclareRoles 注释是在Bean类上指定的,该注释用于声明可从已注释类的方法内进行测试的角色(例如,通过调用isCallerInRole)。声明用作isCallerInRole(String roleName)
方法的参数的角色的名称时,声明的名称必须与参数值相同。
以下示例代码演示了@DeclareRoles批注的用法:
@DeclareRoles("BusinessAdmin")
public class Calculator {
...
}
声明多个角色的语法如下例所示:
@DeclareRoles({"Administrator", "Manager", "Employee"})
要指定没有角色有权访问应用程序中的方法,请使用@DenyAll批注。要指定有权使用任何角色的用户访问应用程序,请使用@PermitAll批注。
与@DeclareRoles批注结合使用时,应用程序将使用组合的安全角色集。
以下示例代码演示了 @RolesAllowed 注释的用法:
@DeclareRoles({"Administrator", "Manager", "Employee"})
public class Calculator {
@RolesAllowed("Administrator")
public void setNewRate(int rate) {
...
}
}
可以在类或一个或多个方法上指定此批注。在类上指定此注释意味着它适用于该类的所有方法。在方法级别指定它意味着它仅适用于该方法。
以下示例代码演示了@PermitAll批注的用法:
import javax.annotation.security.*;
@RolesAllowed("RestrictedUsers")
public class Calculator {
@RolesAllowed("Administrator")
public void setNewRate(int rate) {
//...
}
@PermitAll
public long convertCurrency(long amount) {
//...
}
}
以下示例代码演示了@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 () {...}
...
}
更多信息: