Spring Security项目

在本教程中,我们将使用Spring MVC框架实现Spring Security。所有的示例都是基于Spring MVC创建的,并使用Maven项目。

我们使用的是Spring Security 5.0.0.RELEASE版本,以下是我们在所有示例中使用的Maven依赖项。

<dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-web</artifactId>  
        <version>5.0.0.RELEASE</version>  
</dependency>  
<dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-core</artifactId>  
        <version>5.0.0.RELEASE</version>  
</dependency>  
<dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-config</artifactId>  
        <version>5.0.0.RELEASE</version>  
</dependency>  

要在Spring应用程序中实现Spring Security,我们可以使用XML或基于Java的配置进行配置。

让我们来看一个示例,其中我们将使用XML配置Spring Security。

创建Maven项目

点击File菜单,选择New→Maven Project,如下图所示。

spring-security-xml-example1.png

选择项目名称和位置

spring-security-xml-example2.png

提供项目名称

提供项目名称,并选择打包类型为war(Web Archive),如下所示。

spring-security-xml-example3.png

点击Finish,项目将创建一个空的目录结构,如下所示。

spring-security-xml-example4.png

起初,它是空的。接下来,我们将创建一个Spring MVC应用程序并集成Spring Security。

这是我们的项目布局。它包含一个控制器,三个XML文件和两个JSP文件。

spring-security-xml-example5.png

Spring Security项目源代码

我们的项目名称是springsecurity,包含以下源文件。

控制器

HomeController.java

package cn.javatiku.controller;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
  
@Controller  
public class HomeController {  
      
    @RequestMapping(value="/", method=RequestMethod.GET)  
    public String home() {  
        return "home";  
    }  
      
    @RequestMapping(value="/admin", method=RequestMethod.GET)  
    public String privateHome() {  
        return "privatePage";  
    }  
}  

Spring Security配置

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.xsd  
    http://www.springframework.org/schema/security  
    http://www.springframework.org/schema/security/spring-security.xsd">  
    <http auto-config="true">  
        <intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />  
    </http>  
    <authentication-manager>  
      <authentication-provider>  
        <user-service>  
        <user name="admin" password="1234" authorities="hasRole(ROLE_ADMIN)" />  
        </user-service>  
      </authentication-provider>  
    </authentication-manager>  
</beans:beans>  

Servlet Dispatcher

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:mvc="http://www.springframework.org/schema/mvc"  
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="  
http://www.springframework.org/schema/mvc  
http://www.springframework.org/schema/mvc/spring-mvc.xsd  
http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans.xsd  
http://www.springframework.org/schema/context   
http://www.springframework.org/schema/context/spring-context.xsd">  
<mvc:annotation-driven />  
   <context:component-scan base-package="cn.javatiku.controller">  
   </context:component-scan>  
   <context:annotation-config></context:annotation-config>  
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
      <property name="prefix" value="/WEB-INF/views/"></property>  
      <property name="suffix" value=".jsp"></property>  
   </bean>  
</beans>  

Web描述符

web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE xml>  
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"  
         version="3.1">  
          
        <!-- Spring Configuration -->  
        <servlet>  
            <servlet-name>spring</servlet-name>  
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
            <load-on-startup>1</load-on-startup>  
        </servlet>  
        <servlet-mapping>  
            <servlet-name>spring</servlet-name>  
            <url-pattern>/</url-pattern>  
        </servlet-mapping>  
          
        <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
      
    <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>  
          
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>  
                /WEB-INF/spring-servlet.xml  
                /WEB-INF/spring-security.xml  
            </param-value>  
        </context-param>  
</web-app>  

项目依赖项

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/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn.javatiku</groupId>  
  <artifactId>springsecurity</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>war</packaging>     
<properties>  
    <maven.compiler.target>1.8</maven.compiler.target>  
    <maven.compiler.source>1.8</maven.compiler.source>  
</properties>  
<dependencies>  
  <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-webmvc</artifactId>  
            <version>5.0.2.RELEASE</version>  
        </dependency>  
        <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-web</artifactId>  
        <version>5.0.0.RELEASE</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-core</artifactId>  
        <version>5.0.0.RELEASE</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-config</artifactId>  
        <version>5.0.0.RELEASE</version>  
    </dependency>  
          
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
    <scope>provided</scope>  
</dependency>  
</dependencies>  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-war-plugin</artifactId>  
            <version>2.6</version>  
            <configuration>  
                <failOnMissingWebXml>false</failOnMissingWebXml>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
</project>  

视图页面

home.jsp

<html>  
<head>  
<meta content="text/html; charset=UTF-8">  
<title>Home</title>  
</head>  
<body>  
<h2>Welcome to javatiku spring tutorial!</h2>  
</body>  
</html>  

privatePage.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Admin</title>  
</head>  
<body>  
Hello Admin  
</body>  
</html>  

输出

这个示例在Apache Tomcat v9.0下运行。运行后,会在浏览器中产生以下输出。

首先,它渲染home.jsp页面,显示以下输出:

spring-security-xml-example6.png

我们将Spring Security添加到管理员页面,如果我们在浏览器中输入/admin,应用程序会产生以下输出。

请求URL:http://localhost:8080/springsecurity/admin

spring-security-xml-example7.png

现在,这是Spring Security提供的真正魔力,它可以保护资源免受未经授权的用户访问。

这是Spring Security提供的模块,我们没有创建它。它还会验证用户输入。

提供错误的凭据。

spring-security-xml-example8.png

如果我们提供错误的登录凭据,它将与我们在spring-security.xml文件中提供的用户名和密码进行验证。

验证后,如果登录凭据不正确,它会抛出一个错误消息。

spring-security-xml-example9.png

在这个例子中,我们看到了Spring Security的登录模块以及它如何验证提供的用户名和密码。

在下一个话题中,我们将实现进一步的逻辑,比如在成功登录后渲染用户界面。

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想