当前位置: 首页 > 知识库问答 >
问题:

Spring Security:访问被拒绝后使用admin用户登录后转发到原始页面

司徒焕
2023-03-14

我使用Spring security对用户进行身份验证。如果用户请求安全页面,他必须通过登录页面进行身份验证。如果用户始终通过身份验证,他将被立即重定向到请求的页面。而且有些页面需要特殊的访问权限,所以我临时设置了一个拒绝访问的页面。到目前为止还不错。

场景:场景定义用户将获得一个登录表单,而不是一个静态的拒绝访问页面,这样不同的用户可以进行身份验证,如果验证成功,需要更高权限的请求页面将打开。

spring的实际配置如下:

<security:http auto-config="true" use-expressions="true" disable-url-rewriting="true">
    <security:intercept-url pattern="/index.jsp" access="permitAll" />
    <security:intercept-url pattern="/loginView" access="permitAll" />
    <security:intercept-url pattern="/accessDenied" access="permitAll"/>
    <security:intercept-url pattern="/user" access="hasRole('ROLE_USER')" />
    <security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/**" access="denyAll"/>

    <security:form-login login-page="/loginView"
        authentication-failure-url="/loginView"
        default-target-url="/dirView" />

    <security:logout />
    <security:access-denied-handler ref="accessDeniedHandler" />
</security:http>

accessDeniedHandler-bean:

public class AccessDeniedServletRequestHandler implements AccessDeniedHandler {

/** {@inheritDoc} */
@Override
public void handle(HttpServletRequest req, HttpServletResponse resp,
        AccessDeniedException accessDeniedException) throws IOException,
        ServletException {

    RequestDispatcher d = req.getRequestDispatcher("/loginView");
    d.forward(req, resp);
}
}

但AccessDeniedHandler的实现仅转发到LoginView。对管理员进行身份验证后,默认的success-page是opend,而不是最初请求的page。我还试图通过调用HttpServletRequest#getAttribute(“javax.servlet.forward.servlet_path”)来保存原始请求,但我不明白如何强制spring security使用那个原始请求而不是默认的目标URL。

此外,我还读过关于org.springframework.security.web.SavedRequest.SavedRequest的文章,它在spring身份验证中用于在未经身份验证的用户请求页面时记住原始请求。但是我没有找到一种有效的方法,如何以相同的方式使用SavedRequest来解决访问被拒绝的情况。

提前感谢您的建议和解决方案。

共有1个答案

薛墨一
2023-03-14

我认为应该通过使用requestcacheAPI来满足您的需求。

如果修改HTTP配置,则可以使用request-cache命名空间元素:

<security:http>
    ...
    <security:request-cache ref="requestCache"
</security:http>

<bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache" />

您还可以将其注入到AccessDeniedHandler中。那么您所需要的只是一个简单的tosaverequest来设置缓存的请求,该请求应该在身份验证后恢复:

public class AccessDeniedServletRequestHandler implements AccessDeniedHandler {
    // Inject this into your class.
    private RequestCache requestCache;

    @Override
    public void handle(HttpServletRequest req, HttpServletResponse resp,
            AccessDeniedException accessDeniedException) throws IOException, ServletException {
        requestCache.saveRequest(req, resp);

        RequestDispatcher d = req.getRequestDispatcher("/loginView");
        d.forward(req, resp);
    }
}
 类似资料:
  • 我正在尝试学习Spring Security性,所以我下载了一些示例项目,然后我尝试在我的项目中实现该解决方案。但当我尝试提交登录表单时,我总是得到403页,这是在applicationContext安全性中定义的。xml。但对于无效的用户名/密码,我期望的是“身份验证失败url”,对于正确的用户名/密码,期望的是“默认目标url”,而不是“拒绝访问处理程序”/“禁止访问”(我的403页)。如果有

  • 我刚刚在我的Ubuntu机器上安装了MySQL服务器。所有安装都正常,当它询问我的密码时,我只需点击“回车”键,将密码留空。现在,当我尝试登录时: 只需按enter键,就会出现以下错误: 错误1698 (28000):用户'root'@'localhost'的访问被拒绝 我不知道错误是什么,也不知道如何修复它。有人能帮忙吗?我试图阅读MYSQL文档,但我不明白他们在说什么。 当我尝试访问phpMy

  • 使用带有mountain lion的mac,我刚刚安装了mysql。我现在尝试使用以下命令登录 但会出现以下错误: 我引用了以下问题 基于所有这些答案,我需要在mysql命令行中创建一个新的本地用户,但是如果我不能访问

  • 问题内容: 在看到phpMyAdmin生成的默认密码使用了mysql_native_password并因此在使用相同密码时哈希没有改变,我更新了一个用户的密码并将哈希设置为SHA256。 当我尝试使用设置的密码再次登录时,它说: mysqli_real_connect():(HY000 / 1045):用户’xxxx’@’xxxx’的访问被拒绝(使用密码:是)。 服务器使用https,而phpMy

  • 面对奇怪的问题:应用程序在HTTP上运行良好,但一旦我们添加SLL证书,就会再次重定向到登录页面:下面是spring-security.xml的代码片段 我已经在JBOSS中独立添加了SSL证书。xml格式如下: 当我尝试使用 HTTPS URL(如 https://mydomain.com:8443/mywebapp/login.rs ) 访问我的应用程序时,它会显示用户名密码页。 输入有效凭据

  • 问题内容: 我正在尝试从数据库中获取记录。但我正面临拒绝访问的问题。我尝试了在堆栈溢出中提到的其他解决方案,例如向用户授予特权。 访问数据库的代码: 错误的堆栈跟踪: 在这种情况下可能是什么问题。我尝试创建一个新的数据库,但是也没有用。 问题答案: 问题是授予表根用户的权限。’root’@’%’没有任何权限。.就像我以前用作连接地址一样,因此它给出了拒绝访问错误.. 是IP地址的通配符。所以mys