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

Spring Security HTTP状态403-访问被拒绝

彭星津
2023-03-14

登录成功,但即使我允许访问USER,Spring安全也会阻止url。我如何管理这个东西?

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("sahil").password("123")
                .roles("ADMIN","USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
        .antMatchers("/login").permitAll()
        .antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")
        .and()
        .csrf().disable();
    }

登录控制器。JAVA

    @Controller
public class LoginController {

    @RequestMapping(value = { "/", "/login" }, method = RequestMethod.GET)
    public String showLoginPage() {
        return "login";
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String handleUserLogin(ModelMap model, @RequestParam String name, @RequestParam String password) {
        if (!service.validateUser(name, password)) {
            model.put("errorMsg", "Invalid Credential");
            return "login";
        }
        System.out.println("principal : " + getLoggedInUserName());
        model.put("name", name);
        model.put("password", password);
        return "welcome";
    }

    private String getLoggedInUserName() {

        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        if (principal instanceof UserDetails) {
            System.out.println("in if");
          return  ((UserDetails)principal).getUsername();

        } else {
            System.out.println("in else");
         return principal.toString();

        }
    }

    @RequestMapping(value = "/welcome", method = RequestMethod.GET)
    public String showWelcomeDashboard() {
        return "welcome";
    }
}

1.登录成功后,页面重定向到欢迎页面,但url仍然是localhost:8080/Login,而不是localhost:8080/welcome。

2.重定向到URL localhost:8080/sales后,403访问被拒绝。

共有1个答案

邓兴为
2023-03-14

什么是Spring Security
Spring Security是关于身份验证和授权的,在您的情况下,您缺少身份验证。您的安全配置中没有身份验证配置。您缺少的是Spring Security的身份验证过滤器。Spring Security提供了默认的身份验证过滤器UsernamePasswordAuthenticationFilter,可以由. formLogin()配置。您可以使用默认提供的,也可以定义自己的自定义身份验证过滤器(UsernamePasswordAuthenticationFilter的实现)。

一旦身份验证成功,spring security将为经过身份验证的用户授予权限。如果身份验证配置正确,下面的配置负责身份验证和授权

auth.inMemoryAuthentication().withUser("sahil").password("123")
                .roles("ADMIN","USER");

经过身份验证的用户每个请求都将通过filterFilterSecurityInterceptor传递,它将验证为经过身份验证的用户授予的权限,并为下面代码中给出的资源配置授权。

.antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")

由于没有配置身份验证过滤器,您错过了所有这些。
现在为了简单起见use.form在超文本传输协议配置中登录()。

@Override
protected void configure(final HttpSecurity http) throws Exception
{
    http
    .authorizeRequests()
        .antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")
    .and().exceptionHandling()
        .accessDeniedPage("/403")
    .and().formLogin()
    .and().logout()
        .logoutSuccessUrl("/login?logout=true")
        .invalidateHttpSession(true)
    .and()
        .csrf()
            .disable();
}

. formLogin()没有任何配置,提供带有用户名和密码默认表单参数的默认登录页面。身份验证后,它会重定向到"/"如果您想提供自定义登录页面,请使用以下配置。

.and().formLogin()
       .loginPage("/login")
       .usernameParameter("email").passwordParameter("password")
       .defaultSuccessUrl("/app/user/dashboard")
       .failureUrl("/login?error=true")

。登录页面(“”——您的自定义登录页面URL
。usernameParameter(“”)。passwordParameter(“”)-自定义登录表单参数
。defaultSuccessUrl(“”)-成功验证后的页面url
。failureUrl(“”)-身份验证失败后的页面url

注意:你不应该在你的控制器中使用“/login”POST方法,即使你写了,spring security filter chain也无法访问它。因为你的配置以前是错误的,所以它以前就达到了!现在,从控制器中移除这些组件,并使用上述常规方法

 类似资料: