0

我使用的是Spring Security @PreAuthorize注释,它在我使用文档中或在文档中看到的“已知好的”表达式时有效其他在线示例。示例代码不是真正的用例,它是人为设计的。如何在Spring注释表达式中读取会话变量,特别是@PreAuthorize

以下表达式是对与其下面的示例方法格式相似的方法或方法进行工作的所有变体。这些表达式不是在同一时间使用,或者为了简单起见,它们只是一起显示在这里。

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@PreAuthorize("hasAuthority('PERM_XYZ') or authentication.principal.id == #ownerId") 
@PreAuthorize("hasRole('ROLE_USER') and #someValue == 'testValue'") 
public List<Item> getSomeItems(Integer ownerId, String someValue) { 
    // code goes here 
} 

我想什么能够做的就是在这样的表达测试对会话变量的方法论证:

@PreAuthorize("hasAuthority('PERM_XYZ') or #someValue == session.someOtherValue") 
public List<Item> getSomeItems(Integer someValue) { 
    // code goes here 
} 

我本来以为在表达式访问会话会是一项基本任务,但我还没有在网上找到一个例子,甚至没有人问到如何去做。

我已经尝试了所有的以下还有更多,但他们都产生异常:

@PreAuthorize("#someValue == #session.someValue") 
@PreAuthorize("#someValue == session.someValue") 
@PreAuthorize("#someValue == session.getAttribute('someValue')") 
@PreAuthorize("#someValue == request.session.someValue") 
@PreAuthorize("#someValue == request.session.getAttribute('someValue')") 

上述一切有关春季安全和@PreAuthorize注解,但是那些东西真的不是中央质疑。

我知道访问会话的许多选择,并已解决我的用例,但我仍然想知道是否有可能通过任何注释中的表达式访问会话。

那么......用户会话可以在Spring注解表达式中访问吗?如果是这样的话?谢谢。

+0

如果你正在使用Spring Security的,为什么你要检查一个会话变量,而不是当前登录的用户。 –

+0

我有一种强烈的感觉,即“你为什么要这样做”,情绪几乎立即就会弹出。原始示例代码中的“userId”不是一个真正的用例,因此它已被替换为显示表达式的更通用的示例。我主要想知道是否有一种简单的方法通过注释表达式来访问会话对象或请求对象。这最终是一个好奇心的问题,因为我做不了我认为容易的事情。 –

+0

然后,您可能想要使用不依赖或解析身份验证的示例。该请求应该可用,所以我期望'request.session.getAttribute('someValue')'实际工作。他们是否都会产生相同的异常或不同的异常? –

回答

0

当前的春季EL表达式为#session。 所以,你可以使用

@PreAuthorize("#userId == session.userId") 

但本次会议是在当前的HttpSession,且无财产userId。据spring el access可以使用authenticationprincipal

尝试

@PreAuthorize("#userId == principal.username) 

假设该用户名是用户id ...

+0

上述第一个示例中的引号是否正确?也是正确的语法?在STS/Eclipse中出现“会话无法解析为变量”错误,并且没有可用的快速修复。我在原始问题中错误地引用了问题,但已修复它们。尽管语法看起来不像你的,但我也尝试过#session,但没有成功。由于我想测试的会话值与身份验证或主对象无关,因此我不能使用principal.username,因此该问题被编辑为更一般。 –

相关问题