springsecurity(三)----个性化认证流程

1.自定义登陆页面

  • WebSecurityConfig如下配置
	 //重写该方法 : 自定义配置过滤规则
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()//表单登录
                .loginPage("/login.html")//指定自己的登陆页面
                .loginProcessingUrl("/authentication/login")//配置登录接口路径,需要与页面form表单的action保持一致 告诉security处理该路径
                .and()
                .authorizeRequests()//配置权限
                .antMatchers("/login.html").permitAll()//指定所有用户进行访问指定的url
                .anyRequest()//任何请求
                .authenticated()//都需要身份认证
                .and()
                .csrf().disable();//关闭跨域

    }
  • 在/resources/static目录下编写登陆页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆</title>
</head>
<body>
    <h1>标准登陆</h1>
    <form action="/authentication/login" method="POST">
        用户名 :<input type="text" name="username"><br>
        密码   :<input type="text" name="password"><br>
        <input type="submit" value="登陆"><br>
    </form>
</body>
</html>
  • 注意 上面输入框的name 必须是 username 和password
  • 因为在UsernamePasswordAuthenticationFilter过滤器里 默认用户名和密码如下
  • security认证需要经过该过滤器接受参数
    在这里插入图片描述
  • 重启访问项目http://127.0.0.1:9747/product
    在这里插入图片描述
    自定义页面成功

2. 登陆成功和失败的处理方法

2.1 方法一
  • 当我们登录成功的时候,是由AuthenticationSuccessHandler进行登录结果处理,默认跳转到defaultSuccessUrl配置的路径对应的资源页面

  • 当我们登录失败的时候,是由AuthenticationfailureHandler进行登录结果处理,默认跳转到failureUrl配置的路径对应的资源页面

  • 我们先编写接口实现接口跳转 目前不实现页面跳转 逻辑一样

@RestController
public class JumpPageController {
    //登陆成功返回
    @GetMapping("/success")
    public String success(){
        return "success";
    }
    //登陆失败返回
    @GetMapping("/failure")
    public String failure(){
        return "failure";
    }
}
  • WebSecurityConfig如下配置
    在这里插入图片描述
  • 重新启动 访问
  • 失败
    在这里插入图片描述
  • 成功
    在这里插入图片描述
2.2 方法二 自定义handler
  • 创建LoginFailureHandler类 失败后的处理器
@Component
public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     *
     * @param request
     * @param response
     * @param exception : 登陆失败的原因
     */
    @Override
    public void onAuthenticationFailure(HttpServletRequest request,
                                        HttpServletResponse response,
                                        AuthenticationException exception) throws IOException {
        //exception.getMessage() : 返回登陆失败的原因
        logger.error("登录错误 : {}",exception.getMessage());
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);//400状态码
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);//设置请求头 : application/json;charset=UTF-8
        //创建输出对象
        PrintWriter writer = response.getWriter();
        if ("Bad credentials".equals(exception.getMessage())) {
            writer.write("密码不正确");
        }else {
            writer.write(exception.getMessage());
        }
        writer.flush();
        writer.close();
    }

}
  • 创建LoginSuccessHandler 登陆成功处理器
@Component
public class LoginSuccessHandler implements AuthenticationSuccessHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     *
     * @param request
     * @param response
     * @param authentication 保存了我们登录后的用户信息
     */
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
                                        HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {
        //authentication.getPrincipal() : 获取登录后的用户信息
        logger.info("登陆成功 : {}",authentication.getPrincipal());
        response.setStatus(HttpServletResponse.SC_OK);//200状态码
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);//设置请求头为 application/json;charset=UTF-8
        PrintWriter writer = response.getWriter();
        writer.write("登录成功" + authentication.getPrincipal());
        writer.flush();
        writer.close();
    }
}
  • WebSecurityConfig里配置如下信息
    在这里插入图片描述
  • 启动项目访问
  • 失败
    在这里插入图片描述
  • 成功
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值