首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring安全表达式:“身份验证”与"isAuthenticated()“

Spring安全表达式:“身份验证”与"isAuthenticated()“
EN

Stack Overflow用户
提问于 2021-10-10 11:37:58
回答 2查看 697关注 0票数 0

根据弹簧安全文档,检查用户是否经过身份验证的表达式是isAuthenticated()。例如,我们会做@PreAuthorize("isAuthenticated()")

然而,根据官方例子和我自己的测试所证实的,@PreAuthorize("authenticated")也能工作。

它是Security特性还是简单的Java特性(例如,authenticated是支持getter isAuthenticated()的字段),使authenticated也能工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-10 16:20:17

@PreAuthorize的值是SpEL,根据文档,它将根据根对象SecurityExpressionRoot进行计算。

isAuthenticated()是在SecurityExpressionRoot实例上调用isAuthenticated()的语法(参见)。

authenticated是访问SecurityExpressionRoot实例属性的语法(参见)。它将尝试调用以下公共属性或方法来计算值:

  • authenticated性质
  • getAuthenticated()
  • isAuthenticated() (仅当计算值为布尔值时)
  • authenticated()

您可以在这里的代码中找到这样的逻辑。

票数 3
EN

Stack Overflow用户

发布于 2021-10-10 11:58:20

我已经检查了org.springframework.security.web.servletapi.Servlet3SecurityContextHolderAwareRequestWrapper中的源代码

代码语言:javascript
运行
复制
private boolean isAuthenticated() {
    return getUserPrincipal() != null;
}

然后查看getUserPrincipal()

代码语言:javascript
运行
复制
@Override
public Principal getUserPrincipal() {
    Authentication auth = getAuthentication();
    if ((auth == null) || (auth.getPrincipal() == null)) {
        return null;
    }
    return auth;
}

然后是getAuthentication()。这是重点:

代码语言:javascript
运行
复制
private Authentication getAuthentication() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();//!!!
    return (!this.trustResolver.isAnonymous(auth)) ? auth : null;
}

如其所示,authentication对象由SecurityContextHolder管理。

至于authenticated,我认为它可能是spring容器中的单例Java。它的价值与以下内容相同:

代码语言:javascript
运行
复制
authentication.isAuthenticated();

org.springframework.security.core.Authentication

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69514798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档