7

如果当前请求是安全的,有没有办法“询问”spring security?因为即使我通过了身份验证,我也想检测我是在安全受保护的 URL 中还是在匿名/公共页面中

提前致谢!

4

3 回答 3

2

Spring Security 为此提供了JSP 标签支持。例如:

<sec:authorize url="/admin">

This content will only be visible to users who are authorized to access the "/admin" URL.

</sec:authorize>

Thymeleaf 提供了一种 Spring Security Dialect,它直接支持使用 Spring Security检查 URL 授权。例如:

<div sec:authorize-url="/admin">
    This will only be displayed if authenticated user can call the "/admin" URL.
</div>

如果您的技术不支持直接执行检查,您可以轻松使用WebInvocationPrivilegeEvaluator(这是 JSP taglib 和 Thymeleaf 使用的对象)。例如,您可以直接使用它@Autowire的一个实例。WebInvocationPrivilegeEvaluator显然,语法会根据您使用它的位置(即 GSP、Freemarker 等)而有所不同,但这里有一个直接使用 Java 代码的示例。

@Autowired
WebInvocationPrivilegeEvaluator webPrivs;

public void useIt() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    boolean hasAdminAccess = webPrivs.isAllowed("/admin", authentication);

    boolean hasAdminPostAccess = webPrivs.isAllowed(null, "/admin", "POST", authentication);
}
于 2015-08-11T12:49:58.140 回答
0

我认为您可以使用自己的实现,AccessDecisionVoter 然后只需简单地覆盖Vote方法并使用方法比较拦截 url filterInvocation.getRequestUrl();

@Override
public int vote(Authentication authentication, FilterInvocation filterInvocation,
    Collection<ConfigAttribute> attributes) {
  String requestUrl = filterInvocation.getRequestUrl();
  ....
}
于 2012-09-03T10:29:49.203 回答
0

我们可以将其标记为安全通道,因此转换为 https:// url。

    <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />

然后我们可以使用 request.getScheme() 来识别它。我使用了 org.springframework.security.version 3.1.4.RELEASE

于 2014-01-03T06:53:38.903 回答