Custom Login Page
Learn how to create custom login and logout pages.
We'll cover the following...
We'll cover the following...
Page creation steps
The following steps are needed to do this:
-
Design a login page and write a Thymeleaf template to match that design. The page will need a
<form>
to submit the username and password with two inputs that use username and password as names for the inputs. -
Create a controller that will return the template at
/login
. -
Update
WebSecurityConfiguration
to use the custom login page.
Let’s start with the login.html
template:
Press + to interact
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org"lang="en"><head><meta charset="UTF-8"><title>Taming Thymeleaf - Login</title><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="https://rsms.me/inter/inter.css"><link rel="stylesheet" th:href="@{/css/application.css}"></head><body><div class="min-h-screen bg-gray-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8"><div class="sm:mx-auto sm:w-full sm:max-w-md"><div class="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10"><div class="sm:mx-auto sm:w-full sm:max-w-md mb-6"><img class="mx-auto h-12 w-auto"th:src="@{/img/application-logo.svg}" alt="Application Logo"/></div><form th:action="@{/login}" method="post"><!--.--><!-- tag::logout-confirmation[] --><th:block th:if="${param.logout}"> <!--.--><div th:replace="fragments/alerts :: success(message=#{login.logout.confirmation},useHorizontalPadding=false)"></div></th:block><!-- end::logout-confirmation[] --><div><label for="username" class="block text-sm font-medium text-gray-700"th:text="#{login.username}">Username</label><div class="mt-1 rounded-md shadow-sm"><input id="username"class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-green-500 focus:border-green-500 sm:text-sm"type="text"requiredname="username"><!--.--></div></div><div class="mt-6"><label for="password" class="block text-sm font-medium leading-5 text-gray-700"th:text="#{login.password}">Password</label><div class="mt-1 rounded-md shadow-sm"><input id="password"class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-green-500 focus:border-green-500 sm:text-sm"type="password"requiredname="password"><!--.--></div></div><div class="mt-6 flex items-center justify-between"><div class="flex items-center"><input id="remember_me" type="checkbox"class="h-4 w-4 text-green-600 focus:ring-green-500 border-gray-300 rounded"><label for="remember_me" class="ml-2 block text-sm text-gray-900">Remember me</label></div><div class="text-sm leading-5"><a href="#"class="font-medium text-green-600 hover:text-green-500">Forgot your password?</a></div></div><div class="mt-6"><span class="block w-full rounded-md shadow-sm"><button type="submit"class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500">Sign in</button></span></div></form></div></div></div></body></html>
-
Spring Security expects the form’s action to be set as
/login
Make sure the form is set accordingly. -
The
<input>
should have the username and password attribute values respectively.
Login controller
Next, let’s create ...