春季安全性:使用自定义身份验证器和自定义登录页面

时间:2020-04-15 14:25:07

标签: java spring spring-boot spring-security

我尝试使用Spring Boot Security进行第一步。

我尝试将自定义身份验证器与自定义登录页面结合在一起,但我不确定如何将它们结合在一起。 他们两个人都能很好地工作。

我的自定义身份验证器(Auth)

@Component
public class Auth implements AuthenticationProvider 
{
  @Override
  public Authentication authenticate (Authentication authentication) throws AuthenticationException
  {

    String name = authentication.getName ();
    String password = authentication.getCredentials().toString ();

    System.out.println ("auth: " + name + " / " + password);

    // no checks for now - any input is ok     
    return new UsernamePasswordAuthenticationToken (name, password, new ArrayList <GrantedAuthority> ());  
  }        

  @Override
  public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
  }
}

我的安全性配置(WebSecurity)

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter 
{
  @Override
  protected void configure (HttpSecurity http) throws Exception 
  {
    http.authorizeRequests ()
      .anyRequest ().authenticated ()
      .and ()
      .formLogin ()
       // .loginPage("/login").usernameParameter("username").passwordParameter("password")
      .permitAll ();
    }

    @Autowired
    private Auth authProvider;

    @Override
    protected void configure (AuthenticationManagerBuilder auth) throws Exception 
    {
      // register my custom authenticator here
      auth.authenticationProvider(authProvider);
    }
}

我的/ login(登录)处理程序

@RequestMapping ("/login")
public String login (HttpServletRequest request, Model model) 
{
  System.out.println("login")
  return "login";
}

如果我没有使用自定义登录页面(注释中有.loginPage等),则正在使用我的自定义身份验证器,并且确实会显示内置登录页面。

如果我使用的是custom-loginpage,那么将使用我的自定义login.jsp,但看不到自定义身份验证器的用法。但是/ login的处理程序被调用。

自定义身份验证器和custon登录页面的组合也应该开箱即用或 我是否需要将它们粘合在一起(也许在登录处理程序中)?

编辑

login.jsp

<html>
    <body>
        MyLogin
        <form action="/security_check" method="post">               
            username<input type="text" id="username" name="username"/>        
            <br/>
            password<input type="password" id="password" name="password"/>    
            <br/>
            <input type="submit" value="login"/>
        </form>
   </body>
</html>

我的新安全配置:

http.authorizeRequests ()
    .antMatchers ("/sec*").permitAll ()
    .anyRequest ().authenticated ()
    .and ()
    .formLogin ().loginPage("/login").loginProcessingUrl("/security_check")
    .permitAll ();

2 个答案:

答案 0 :(得分:1)

您的自定义身份验证器配置正确。问题出在您的自定义登录页面上。

因此,您的自定义登录页面应至少包含一个包含两个字段的表单:用户名和密码,以及对URL的POST操作,例如“ / security_check”,Spring Security将处理该用户名和密码。然后在您的spring安全配置中,将其配置为loginProcessingUrl,如下所示:

.formLogin().loginPage("/login").loginProcessingUrl("/security_check").permitAll();

当然,您也可以像现在一样指定username参数和password参数。

usernameParameter("username").passwordParameter("password")

您缺少的部分是loginProcessingUrl,用于使用Spring Security钩住您的自定义登录页面,该页面将使用您的自定义身份验证器对用户进行身份验证。

答案 1 :(得分:0)

发现只有在登录页面中有隐藏信息的情况下,它才起作用。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}

然后我不需要

<input type="hidden"
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>

在配置中-仅此而已。

不知道为什么,但是我接受了。

我来自: https://www.logicbig.com/tutorials/spring-framework/spring-security/custom-login-page.html