首页 > 其他分享 >SpringSecurity过滤器之DefaultLoginPageGeneratingFilter

SpringSecurity过滤器之DefaultLoginPageGeneratingFilter

时间:2023-05-02 15:11:49浏览次数:44  
标签:String logoutSuccess loginError request SpringSecurity sb 过滤器 DefaultLoginPageGe

DefaultLoginPageGeneratingFilter用于生成默认登录页。

private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
		throws IOException, ServletException {
	boolean loginError = isErrorPage(request);
	boolean logoutSuccess = isLogoutSuccess(request);
	if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
		String loginPageHtml = generateLoginPageHtml(request, loginError, logoutSuccess);
		response.setContentType("text/html;charset=UTF-8");
		response.setContentLength(loginPageHtml.getBytes(StandardCharsets.UTF_8).length);
		response.getWriter().write(loginPageHtml);
		return;
	}
	chain.doFilter(request, response);
}

generateLoginPageHtml生成登录页面。

private String generateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess) {
	String errorMsg = "Invalid credentials";
	if (loginError) {
		HttpSession session = request.getSession(false);
		if (session != null) {
			AuthenticationException ex = (AuthenticationException) session
					.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
			errorMsg = (ex != null) ? ex.getMessage() : "Invalid credentials";
		}
	}
	String contextPath = request.getContextPath();
	StringBuilder sb = new StringBuilder();
	sb.append("<!DOCTYPE html>\n");
	sb.append("<html lang=\"en\">\n");
	sb.append("  <head>\n");
	sb.append("    <meta charset=\"utf-8\">\n");
	sb.append("    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n");
	sb.append("    <meta name=\"description\" content=\"\">\n");
	sb.append("    <meta name=\"author\" content=\"\">\n");
	sb.append("    <title>Please sign in</title>\n");
	sb.append("    <link href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css\" "
			+ "rel=\"stylesheet\" integrity=\"sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M\" crossorigin=\"anonymous\">\n");
	sb.append("    <link href=\"https://getbootstrap.com/docs/4.0/examples/signin/signin.css\" "
			+ "rel=\"stylesheet\" crossorigin=\"anonymous\"/>\n");
	sb.append("  </head>\n");
	sb.append("  <body>\n");
	sb.append("     <div class=\"container\">\n");
	if (this.formLoginEnabled) {
		sb.append("      <form class=\"form-signin\" method=\"post\" action=\"" + contextPath
				+ this.authenticationUrl + "\">\n");
		sb.append("        <h2 class=\"form-signin-heading\">Please sign in</h2>\n");
		sb.append(createError(loginError, errorMsg) + createLogoutSuccess(logoutSuccess) + "        <p>\n");
		sb.append("          <label for=\"username\" class=\"sr-only\">Username</label>\n");
		sb.append("          <input type=\"text\" id=\"username\" name=\"" + this.usernameParameter
				+ "\" class=\"form-control\" placeholder=\"Username\" required autofocus>\n");
		sb.append("        </p>\n");
		sb.append("        <p>\n");
		sb.append("          <label for=\"password\" class=\"sr-only\">Password</label>\n");
		sb.append("          <input type=\"password\" id=\"password\" name=\"" + this.passwordParameter
				+ "\" class=\"form-control\" placeholder=\"Password\" required>\n");
		sb.append("        </p>\n");
		sb.append(createRememberMe(this.rememberMeParameter) + renderHiddenInputs(request));
		sb.append("        <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign in</button>\n");
		sb.append("      </form>\n");
	}
	if (this.openIdEnabled) {
		sb.append("      <form name=\"oidf\" class=\"form-signin\" method=\"post\" action=\"" + contextPath
				+ this.openIDauthenticationUrl + "\">\n");
		sb.append("        <h2 class=\"form-signin-heading\">Login with OpenID Identity</h2>\n");
		sb.append(createError(loginError, errorMsg) + createLogoutSuccess(logoutSuccess) + "        <p>\n");
		sb.append("          <label for=\"username\" class=\"sr-only\">Identity</label>\n");
		sb.append("          <input type=\"text\" id=\"username\" name=\"" + this.openIDusernameParameter
				+ "\" class=\"form-control\" placeholder=\"Username\" required autofocus>\n");
		sb.append("        </p>\n");
		sb.append(createRememberMe(this.openIDrememberMeParameter) + renderHiddenInputs(request));
		sb.append("        <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign in</button>\n");
		sb.append("      </form>\n");
	}
	if (this.oauth2LoginEnabled) {
		sb.append("<h2 class=\"form-signin-heading\">Login with OAuth 2.0</h2>");
		sb.append(createError(loginError, errorMsg));
		sb.append(createLogoutSuccess(logoutSuccess));
		sb.append("<table class=\"table table-striped\">\n");
		for (Map.Entry<String, String> clientAuthenticationUrlToClientName : this.oauth2AuthenticationUrlToClientName
				.entrySet()) {
			sb.append(" <tr><td>");
			String url = clientAuthenticationUrlToClientName.getKey();
			sb.append("<a href=\"").append(contextPath).append(url).append("\">");
			String clientName = HtmlUtils.htmlEscape(clientAuthenticationUrlToClientName.getValue());
			sb.append(clientName);
			sb.append("</a>");
			sb.append("</td></tr>\n");
		}
		sb.append("</table>\n");
	}
	if (this.saml2LoginEnabled) {
		sb.append("<h2 class=\"form-signin-heading\">Login with SAML 2.0</h2>");
		sb.append(createError(loginError, errorMsg));
		sb.append(createLogoutSuccess(logoutSuccess));
		sb.append("<table class=\"table table-striped\">\n");
		for (Map.Entry<String, String> relyingPartyUrlToName : this.saml2AuthenticationUrlToProviderName
				.entrySet()) {
			sb.append(" <tr><td>");
			String url = relyingPartyUrlToName.getKey();
			sb.append("<a href=\"").append(contextPath).append(url).append("\">");
			String partyName = HtmlUtils.htmlEscape(relyingPartyUrlToName.getValue());
			sb.append(partyName);
			sb.append("</a>");
			sb.append("</td></tr>\n");
		}
		sb.append("</table>\n");
	}
	sb.append("</div>\n");
	sb.append("</body></html>");
	return sb.toString();
}

登录页面url是/login,登录失败url是/login?error,登录表单url是/login(POST方式),登陆成功url是/login?logout,用户名参数名是username,密码参数名是password。

标签:String,logoutSuccess,loginError,request,SpringSecurity,sb,过滤器,DefaultLoginPageGe
From: https://www.cnblogs.com/shigongp/p/17367651.html

相关文章

  • SpringSecurity过滤器之SecurityContextHolderAwareRequestFilter,RequestCacheAwareFi
    SecurityContextHolderAwareRequestFilterSecurityContextHolderAwareRequestFilter对Servelet3.0的api做了封装。publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain) throwsIOException,ServletException{ chain.doFilter(this.requestF......
  • 哈希表与布隆过滤器
    一、哈希的整体思想最简单的哈希表其实就是数组,从数组中取出一个数的时间复杂度是O(1)的。但是数组下标类型是整型的,万一我的下标类型不是整型了该怎么办呢?比如说字符串型,典型的就是我想查找某个单词存不存在。还有些更复杂的数据类型,比如自定义的类型。那么问题就来了,如何满足任......
  • springSecurity过滤器之AnonymousAuthenticationFilter
    SpringSecurity提供了匿名登录功能,让我们不登录也能访问。比如/anoy路径及子路径都能匿名访问,配置如下:@ConfigurationpublicclassMySecurityConfigextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException......
  • SpringSecurity过滤器之SecurityContextPersistenceFilter
    SecurityContextPersistenceFilter在请求之前从配置的SecurityContextRepository获得的信息填充SecurityContextHolder,并在请求完成并清除上下文holder后将其存储回存储库。默认情况下,它使用HttpSessionSecurityContextRepository。privatevoiddoFilter(HttpServletRequestreq......
  • SpringSecurity过滤器之SessionManagementFilter
    SessionManagementFilter检测用户自请求开始以来是否已通过身份验证,如果已通过,则调用SessionAuthenticationStrategy以执行任何与会话相关的活动,例如激活会话固定保护机制或检查多个并发登录。配置如下:@ConfigurationpublicclassMySecurityConfigextendsWebSecurityConfigur......
  • 接口过期过滤器
    注解类importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***过期接口通知*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,......
  • 接口重复调用限制过滤器
    注解类importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***重复请求过滤器*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD......
  • SpringBoot SpringSecurity 介绍(基于内存的验证)
    SpringBoot集成SpringSecurity+MySQL+JWT附源码,废话不多直接盘SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动SpringSecurity。目的:验证请求用户的身份,提供安全访问优势:基于Spring,配置方便,减少大量代码内置访问控制方法permitAll()表示所匹配的......
  • SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
    SpringBoot集成SpringSecurity+MySQL+JWT无太多理论,直接盘一般用于Web管理系统可以先看SpringBootSpringSecurity基于内存的使用介绍本文介绍如何整合SpringSecurity+MySQL+JWT数据结构数据库脚本:https://gitee.com/VipSoft/VipBoot/blob/develop/vipsoft-sec......
  • SpringSecurity从入门到精通:认证成功处理器&认证失败处理器
    认证成功处理器  认证失败处理器  ......