haoxiaolan 2024-04-20 14:11 采纳率: 34.7%
浏览 9
已结题

Spring Security 登录后不会正常调转页面

Spring Security
@RestController
public class TestController {

    @GetMapping("/login‐success")
    public String loginSuccess(){
        return " 登录成功";
    }


    @GetMapping("/r/r1")
    public String r1(){
        return "资源1";
    }

    @GetMapping("/r/r2")
    public String r2(){
        return "资源2";
    }
}

package com.security.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
        return manager;
    }


    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/r/r1").hasAuthority("p1")
                .antMatchers("/r/r2").hasAuthority("p2")
                .antMatchers("/r/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin().successForwardUrl("/login‐success");
    }

}

结果

img

img

哪里写错了

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-20 14:11
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码和描述来看,问题可能出在Spring Security的配置和前端请求路径上。首先,让我们分析一下问题:

    1. 登录页面: 图1中的登录表单看起来是基于/login的,但是WebSecurity配置中设置的formLogin().successForwardUrl("/login-success")似乎指向了一个不存在的/login-success。你需要确保这个URL存在并且与实际的登录处理逻辑匹配。如果你的登录逻辑是在TestController中,那么应该将successForwardUrl改为"/",表示登录成功后跳转到根路径。

    2. 授权: 在configure(HttpSecurity http)方法中,/r/r1/r/r2分别要求不同的权限(p1p2),但前端请求的路径没有明确指定哪个权限。为了使/r/r1/r/r2能正确跳转,你需要确保用户在登录时获得了相应的权限。在userDetailsService中创建用户时,可以给每个用户分配所需的权限,例如:

      manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
      manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
      
    3. 错误信息: 图2中的错误提示表明收到的是Method Not Allowed (405)错误,这通常是因为服务器不允许使用当前请求方法(GET或POST)。检查configure(HttpSecurity http)方法,确认formLogin()部分是否正确配置了登录方法,比如:

      .formLogin().loginPage("/login").loginProcessingUrl("/login").successHandler(successHandler).permitAll()
      

      其中loginProcessingUrl应该与前端发送登录请求的URL相匹配,可能是"/login"

    4. 前端路由: 如果你使用的是前端路由(如Angular、Vue等),确保在提交登录表单后,前端发送的请求地址是"/login",而不是"/login-success"。登录成功后,前端应该自动重定向到正确的资源视图,这不需要在Spring Security中额外配置。

    综上所述,要解决这个问题,你可以尝试以下步骤:

    1. successForwardUrl修改为"/"
    2. userDetailsService中为每个用户分配正确的权限。
    3. 确保formLogin().loginProcessingUrl("/login")与前端登录请求的URL匹配。
    4. 检查前端路由,确保登录成功后跳转到正确的资源视图。

    请确保代码和配置中的路径匹配,并且前端和后端的交互逻辑一致。如果问题仍然存在,检查是否有其他中间件或拦截器干扰了登录流程。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月10日
  • 专家已采纳回答 5月2日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥15 comsol仿真压阻传感器