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

登录后,Spring Security再次重定向到登录页面

张岳
2023-03-14

我使用的是Spring Security 4.1.1,但我遇到了一个问题:我试图访问URL,应用程序会重定向到登录页面。到现在为止,一直都还不错。

但是,成功登录后,应用程序会再次将我重定向到登录页面,并且不会创建任何会话,因此即使尝试直接访问URL(在URL栏中键入),应用程序也会重定向到登录页面。

有一些URL我必须要求登录才能访问它们。其他的,我可以访问无需身份验证。这些我不需要验证的URL工作得很好(即不要求登录,URL被访问),但那些需要验证的URL要求登录,但在键入用户名和密码后,它会再次重定向到登录页面,我无法直接访问URL。

我的confiure()方法是这样的:

// Those URL pattern I need authentication to access them.
protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/admin/gerenciar/**", "/admin/adicionar/**", "/admin/index.html", "/admin/").
            authenticated().and().formLogin().loginPage("/admin/login.html").permitAll();
}

我不确定是否需要发布任何其他代码来澄清我的问题或帮助他人回答我。如果是,请告诉我,以便我可以更新我的问题。

编辑1

一个问题:我想为antMatcher()方法参数中的那些URL请求身份验证:我需要写“/admin/index.html”和“/admin/”吗?Spring Security也一样吗?

编辑2

我想让每个人都可以访问的URL:“/”和“/管理员/资源/**”。在/admin/resources中,我有css和js,这就是为什么我希望每个人都能访问它们。这些URL不需要身份验证。

我需要人们对URL进行身份验证:“/admin/gerenciar/**", "/admin/adicionar/**”和“/admin/”(当然,隐含地说“/admin/index.html”)。

我现在的问题是:如何为它编写代码(在configure()方法中)?

共有3个答案

裴浩歌
2023-03-14

我发现了一个解决方法,它在这里提供了预期的功能,但有一个重要的缺陷:在旧版本中,Spring-boot默认使用的加密NoOpPasswordEncoder现在被认为是不安全的。我想,这个解决方案强制执行了这种加密,所以对于学习目的或安全环境来说是可以的。

只需将其添加到密码字符串中:{noop}。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

// create two users, admin and user
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

    auth.inMemoryAuthentication()
            .withUser("user").password("{noop}pass").roles("USER")
            .and()
            .withUser("admin").password("{noop}pass").roles("ADMIN");
}

我有兴趣阅读关于这一点的解释,这对我来说并不简单。

左丘成天
2023-03-14

这对我有用。登录成功后,Spring security将重定向到“/”,然后检查用户是否经过身份验证,在本例中,将其重定向到我的仪表板页面。

@RequestMapping("/")
    public String index(Model model) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (!(auth instanceof AnonymousAuthenticationToken))
            return "dashboard";

        // if it is not authenticated, then go to the index...
        // other things ...
        return "index";
    }
呼延景同
2023-03-14

我的理解是-

任何人都可以访问/管理/登录。html和/admin/resources/**,而不是其他管理员URL?

我认为方法应该是-

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/**", "/admin/login.html", "/admin/resources/**").permitAll()
        .antMatchers("/admin/**", "/admin/gerenciar/**", "/admin/adicionar/**").
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/admin/login.html")
            .permitAll();
}
 类似资料:
  • 记录器文件中的日志- org.springframework.Security.Access.event.loggerlistener-安全授权失败,原因是:org.springframework.Security.Access.accessdeniedexception:访问被拒绝;通过身份验证的主体:org.springframework.security.authentication.ano

  • 问题内容: 我正在做一个简单的论坛,由一系列论坛组成,每个论坛分别代表首页,主题,postitit,登录名和用户列表页面。在某些页面上,当用户未登录时会出现一个链接。 我想要实现的是在登录后触发重定向(在RequestDispatcher上使用forward()),以便浏览器返回到用户在单击登录链接之前所在的页面。为此,我看到了两种解决方案。 第一种解决方案是使用带有登录按钮的HTML 和一个不可

  • 我有一个登录表单,在单击时调用以下函数。 然后使用重定向 但我面临的问题是,当我第一次登录时,重定向无法工作。它设置了所有的cookie等等,但是它从来没有将用户重定向到想要的目录。所以我被迫在浏览器搜索栏中输入我想要的路由来重定向自己。 这意味着,一旦我强迫自己进入想要的目录,如果我注销(基本上删除cookies),并尝试再次登录。这一次重定向起作用了。 在我用Ctrl+F5清除所有缓存之前,它

  • 我在Laravel5.2中使用了php artisan函数。 我想重定向的客人登录页面,若客人点击链接,只有用户并没有客人。 我想在登录后将用户重定向到后面的页面。 我怎么能这么做?请详细展示一些文件名示例。 ///////编辑 路线 控制器 Kernel.php

  • 这是views.py的内容: 在转到“/”时,我被重定向到“/accounts/login”,它将我带到登录页面。我输入用户名和密码后,在“验证”打印语句printd“登录”到终端。 到目前为止还不错。现在,我不再被重定向到“/”,而是再次被重定向到“/accounts/login”,并再次显示输入用户名和密码的页面。为什么?

  • 我现在一直在努力使用我的登录页面来让组件呈现Loggedin组件。我的前端是Reactjs,后端是NodeJS。我对nodejs、expression和react都是新手。 在loginform组件上,我使用fetch进行了一次post,它将用户名和密码传递给后端的相应endpoint。没问题。在后端,它读取我存储用户(不使用任何数据库)的jsonfile来查找匹配项,如果用户名和密码都匹配,则它