Spring Security 自定义登录表单示例


在这篇文章中,我们将看到如何将自定义登录表单 spring security 应用于spring mvc hello world 示例。

如果您想保护您的 Spring Web 应用程序,您只需要配置一些文件以使用 Spring Security 实

以下是在 spring mvc hello world 示例上应用 spring security 自定义登录表单的步骤。

第 1 步: 创建名为 SpringSecurityHelloWorldExample 的Spring mvc hello world 示例。它将创建基本的 spring mvc 应用程序。

步骤 2: 将 spring security 添加到 pom.xml。您需要将以下依赖项添加到 pom.xml 中。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.arpit.java2blog</groupId>
<artifactId>SpringSecurityHelloWorlExample</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringSecurityHelloWorldExample Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>

  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
  </dependency>

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${spring.version}</version>
  </dependency>
   <!-- Spring Security -->
               <dependency>
               <groupId>org.springframework.security</groupId>
                             <artifactId>spring-security-core</artifactId>
               <version>${security.version}</version>
               </dependency>

               <dependency>
               <groupId>org.springframework.security</groupId>
               <artifactId>spring-security-web</artifactId>
               <version>${security.version}</version>
               </dependency>

               <dependency>
               <groupId>org.springframework.security</groupId>
               <artifactId>spring-security-config</artifactId>
               <version>${security.version}</version>
               </dependency>

               <dependency>
               <groupId>jstl</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
               <scope>provided</scope>
               </dependency>
</dependencies>
<build>
  <finalName>SpringSecurityHelloWorlExample</finalName>

  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
     <source>${jdk.version}</source>
     <target>${jdk.version}</target>
    </configuration>
   </plugin>
  </plugins>

</build>
<properties>
  <spring.version>4.2.1.RELEASE</spring.version>
  <security.version>4.0.3.RELEASE</security.version>
  <jdk.version>1.7</jdk.version>
</properties>

</project>

创建控制器并查看

第 3 步: 更改名为 “HelloWorldController.java”的控制器类,如下所示

package org.arpit.java2blog.springmvc.controller;

import java.security.Principal;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloWorldController {

    @RequestMapping("/helloworld")
    public ModelAndView hello(ModelMap model,Principal principal) {

        String loggedInUserName=principal.getName();

        return new ModelAndView("hello", "userName", loggedInUserName);
    }

    @RequestMapping(value="/login", method = RequestMethod.GET)
    public String login(ModelMap model) {

        return "login";

    }

    @RequestMapping(value="/loginError", method = RequestMethod.GET)
    public String loginError(ModelMap model) {
        model.addAttribute("error", "true");
        return "login";

    }
}

当请求首先到达 dispatcherServlet 并重定向到控制器类。这里@Controller 描述了这是我们的控制器类。@RequestMapper 用于将传入的 http 请求映射到处理程序方法(上述控制器中的 hello())。因此 HelloWorldController.java 的 hello() 方法将处理来自调度程序的 GET 请求。 在这里,我们使用了 Principal 对象来获取当前登录的用户名。它由 Spring 安全框架设置。

第四步: 修改 / WEB-INF/pages 文件夹下的hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
${message}

<c:url value="/j_spring_security_logout" var="logoutUrl" />
Log Out

</body>
</html>

第五步:在/ WEB-INF/pages 文件夹中 创建login.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<style type="text/css">
<%@include file="style.css" %>
</style>
<head>
<title>Custom Login Page</title>
</head>
<body onload='document.loginForm.j_username.focus();'>
<h3>Custom Login Page</h3>

<%

String errorString = (String)request.getAttribute("error");
if(errorString != null && errorString.trim().equals("true")){
out.println("<span class="dark">Incorrect login name or password. Please try again");
}
%>
<form name='loginForm' action="<c:url value='login' />""
method='POST'>

<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''>
</td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password' />
</td>
</tr>
<tr>
<td><input name="submit" type="submit"
value="submit" />
</td>
<td><input name="reset" type="reset" />
</td>
</tr>
</table>

</form>
</body>
</html>

我们在上面的 login.jsp 中使用了 css 文件。如下创建 style.css 文件。

#header
{
font-size:40px;
}
.dark
{
color:red;
}

第 6 步:

现在我们需要添加spring配置xml。创建一个名为spring-security.xml 的文件。

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

<http auto-config="true" use-expressions="true">
  <intercept-url pattern="/resources/**" access="permitAll" />
  <intercept-url pattern="/hello*" access="hasRole('ROLE_ADMIN')" />

<form-login login-page="/login" default-target-url="/helloworld"
   authentication-failure-url="/loginError" />
  <logout logout-success-url="/" logout-url="/j_spring_security_logout" />
  <csrf disabled="true" />
</http>

<authentication-manager>
  <authentication-provider>
   <user-service>
    <user name="java2blog" password="java123" authorities="ROLE_ADMIN" />
    <user name="arpit" password="arpit123" authorities="ROLE_ADMIN" />

   </user-service>
  </authentication-provider>
</authentication-manager>

</beans:beans>

我们在上面的文件中使用了form-login,所以如果用户试图访问任何安全的 url,他将根据上面的 form-login 配置进行身份验证。 让我们了解 form-login 标签的每个属性的含义

login-page:我们需要提供登录页面的 url。 default-target-url:这里如果认证成功,则应提供目标页面 url。 authentication-failure-url:如果身份验证不成功,则应在此处提供重定向页面 url。

intercept-url 配置为哪种模式配置哪种安全性。例如:如果 http 请求的 url 有模式/hello* (hello.jsp,helloworld.html),它只会被ROLE_ADMIN访问。

我们在身份验证管理器中对用户名(java2blog 和 arpit)和密码(java123 和 arpit123)进行了硬编码,因此如果用户为管理员提供正确的凭据,那么只有他能够访问 helloworld.html。

第七步: springmvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="org.arpit.java2blog.springmvc.controller" />

<bean
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix">
   <value>/WEB-INF/pages/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
</bean>
<mvc:annotation-driven/>

</beans>

第8步:我们需要在web.xml中更改配置spring security。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>springmvc-dispatcher</servlet-name>
    <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
   <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   /WEB-INF/springmvc-dispatcher-servlet.xml,
   /WEB-INF/spring-security.xml
  </param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Spring Security -->
<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

在这里,我们使用了 DelegatingFilterProxy 来拦截 http 请求并将其传递给 springSecurityFilterChain。springSecurityFilterChain是由 spring 创建的一个 bean,在spring-security.xml中使用了**http**元素。它维护所有过滤器的列表并负责过滤器链。

我们完成了 Spring Security 所需的更改。

第9步: 是时候构建maven了。 img

提供干净安装的目标(如下所示)并单击运行

img

运行应用程序

步骤 10: 右键单击项目 -> 运行方式 -> 在服务器上运行

选择apache tomcat并点击finish

img

您将看到以下屏幕:

img

当您点击上面的链接时,您将获得以下登录页面。

img

如果您输入错误的密码并尝试登录,您将看到以下屏幕

img

img

如果您输入正确的用户名和密码

img

答对了 !!您已成功登录。


原文链接:https://codingdict.com/