我尝试使用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 ();
答案 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