IntelliJ IDEA
自定义用户认证逻辑包括:处理用户信息获取逻辑、处理用户校验逻辑、处理密码加密解密。我们首先写用户信息获取逻辑,从数据库中查询用户信息,然后构建UserDetail的实现类User对象返回。处理用户信息获取逻辑需要使用UserDetailsService接口。
接下来我们处理用户的校验逻辑,1.是密码是否匹配,输入的密码经过加密后和数据库中存在的加密密码进行对比,springSecurity可以帮你完成 2. 用户是否被冻结以及密码是否过期等的校验。密码的加密和解密,我们可以使用Spring Security的PasswordEncoder。@Beanpublic PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder();}处理用户校验逻辑写在UserDetails接口的实现里。String password = passwordEncoder.encode('your password');
那么实际开发中如何自定义登录页面呢?我们在配置类中的configure(HttpSecurity http)方法中的,http.formLogin().loginPage('/demo-signIn.html')。我们在resources下面创建resources目录,创建demo-signIn.html。我们还需要给这个路径授权,antMatchers('/demo-signIn.html').permitAll()
SpringSecurity开发基于表单的认证流程如下:我们需要根据是html请求还是数据请求来处理不同的返回。我们创建BrowserSecurityController类,我们先去判断是什么请求,然后重定向到页面或者返回json数据。 private RequestCache requestCache = new HttpSessionRequestCache(); private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); @RequestMapping('/authentication/require') @ResponseStatus(code = HttpStatus.UNAUTHORIZED) public SimpleResponse requireAuthentication(HttpServletRequest request, HttpServletResponse response) throws IOException { SavedRequest savedRequest = requestCache.getRequest(request, response); if (savedRequest != null) { String targetUrl = savedRequest.getRedirectUrl(); logger.info('引发跳转的请求是:' + targetUrl); if (StringUtils.endsWithIgnoreCase(targetUrl, '.html')) { redirectStrategy.sendRedirect(request, response, securityProperties.getBrowser().getLoginPage()); } } return new SimpleResponse('访问的服务需要身份认证,请引导用户到登录页'); }
如何自定义登录成功的处理?如何自定义登录失败的处理?我们使用AuthenticationSuccessHandler处理登录成功的请求,使用AuthenctiationFailureHandler处理登录失败的请求。
以上是SpringSecurity开发基于表单的认证的基本逻辑,并非实际代码。