Spring安全示例教程

Spring Security提供了在Web应用程序中执行身份验证和授权的方法。我们可以在任何基于servlet的Web应用程序中使用spring security。

目录[ 隐藏 ]

  • 1春季安全

    • 1.1 Spring安全示例
    • 1.2 Spring Security Maven依赖
    • 1.3 Spring安全示例查看页面
    • 1.4 Spring安全示例UserDetailsS​​ervice DAO实现
    • 1.5 Spring安全示例WebSecurityConfigurer实现
    • 1.6将Spring Security Web与Servlet API集成
      • 1.6.1在没有安全性的情况下访问HTML页面
      • 1.6.2认证证书失败认证失败
      • 1.6.3具有Spring Security JDBC身份验证的主页
      • 1.6.4具有Spring Security UserDetailsS​​ervice DAO身份验证的主页
      • 1.6.5具有Spring Security内存中认证的主页
      • 1.6.6注销页面

Spring 安全


使用Spring Security的一些好处是:

  1. 经过验证的技术,使用它比重新发明轮子更好。安全性是我们需要特别小心的事情,否则我们的应用程序将容易受到攻击者的攻击。
  2. 防止一些常见攻击,如CSRF,会话固定攻击。
  3. 易于集成到任何Web应用程序中。我们不需要修改Web应用程序配置,spring会自动将安全过滤器注入Web应用程序。
  4. 通过不同方式提供对身份验证的支持 - 内存,DAO,JDBC,LDAP等等。
  5. 提供忽略特定URL模式的选项,适用于提供静态HTML,图像文件。
  6. 支持组和角色。

Spring安全示例

我们将创建一个Web应用程序并将其与Spring Security集成。

使用Eclipse中的“ Dynamic Web Project ”选项创建Web应用程序,以便我们的框架Web应用程序准备就绪。确保将其转换为maven项目,因为我们使用Maven进行构建和部署。如果您不熟悉这些步骤,请参阅Java Web应用程序教程。

一旦我们确保我们的应用程序安全,最终的项目结构将如下图所示。

我们将研究三种Spring安全认证方法。

  1. 在记忆中
  2. DAO
  3. JDBC

对于JDBC,我使用MySQL数据库并执行以下脚本来创建用户详细信息表。


CREATE TABLE `Employees` (`username` varchar(20) NOT NULL DEFAULT '',`password` varchar(20) NOT NULL DEFAULT '',`enabled` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `Roles` (`username` varchar(20) NOT NULL DEFAULT '',`role` varchar(20) NOT NULL DEFAULT '',PRIMARY KEY (`username`,`role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `Employees` (`username`, `password`, `enabled`)
VALUES('pankaj', 'pankaj123', 1);INSERT INTO `Roles` (`username`, `role`)
VALUES('pankaj', 'Admin'),('pankaj', 'CEO');commit;

我们还需要在我们的servlet容器中将JDBC DataSource配置为JNDI,要了解这一点,请阅读Tomcat JNDI DataSource示例。

Spring Security Maven依赖项

这是我们的最终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>WebappSpringSecurity</groupId><artifactId>WebappSpringSecurity</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- Spring Security Artifacts - START --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>3.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>3.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>3.0.5.RELEASE</version></dependency><!-- Spring Security Artifacts - END --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>compile</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.0.2.RELEASE</version></dependency></dependencies><build><sourceDirectory>src</sourceDirectory><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>2.3</version><configuration><warSourceDirectory>WebContent</warSourceDirectory><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build>
</project>

我们有以下与Spring Framework相关的依赖项。

  1. spring-jdbc:这用于JDBC身份验证方法的JDBC操作。它需要将DataSource设置为JNDI。有关它的用法的完整示例,请参阅Spring DataSource JNDI示例
  2. spring-security-taglibs:Spring Security标记库,我用它在JSP页面中显示用户角色。大多数时候,你不会需要它。
  3. spring-security-config:用于配置身份验证提供程序,是否使用JDBC,DAO,LDAP等。
  4. spring-security-web:该组件将Spring Security与Servlet API集成在一起。我们需要它来在Web应用程序中插入我们的安全配置。

另请注意,我们将使用Servlet API 3.0功能通过编程方式添加侦听器和过滤器,这就是依赖项中的servlet api版本应为3.0或更高的原因。

Spring安全示例查看页面

我们的应用程序中有JSP和HTML页面。我们希望在除HTML页面之外的所有页面中应用身份验证。

health.html


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Health Check</title>
</head>
<body><h3>Service is up and running!!</h3>
</body>
</html>

index.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<!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>Home Page</title>
</head>
<body>
<h3>Home Page</h3><p>Hello <b><c:out value="${pageContext.request.remoteUser}"/></b><br>Roles: <b><sec:authentication property="principal.authorities" /></b></p><form action="logout" method="post"><input type="submit" value="Logout" /><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/></form>
</body>
</html>

我已经包括index.jspwelcome-file在应用程序部署描述符。

Spring Security负责CSRF攻击,因此当我们提交注销表单时,我们将CSRF令牌发送回服务器以将其删除。Spring Security组件设置的CSRF对象是_csrf,我们使用它的属性名和标记值在注销请求中传递。

我们现在来看看Spring Security配置。

Spring安全示例UserDetailsS​​ervice DAO实现

由于我们也将使用基于DAO的身份验证,我们需要实现UserDetailsService接口并提供loadUserByUsername()方法的实现。

理想情况下,我们应该使用一些资源来验证用户,但为了简单起见,我只是在进行基本验证。

AppUserDetailsServiceDAO.java


package com.journaldev.webapp.spring.dao;import java.util.Collection;
import java.util.List;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;public class AppUserDetailsServiceDAO implements UserDetailsService {protected final Log logger = LogFactory.getLog(getClass());@Overridepublic UserDetails loadUserByUsername(final String username)throws UsernameNotFoundException {logger.info("loadUserByUsername username="+username);if(!username.equals("pankaj")){throw new UsernameNotFoundException(username + " not found");}//creating dummy user details, should do JDBC operationsreturn new UserDetails() {private static final long serialVersionUID = 2059202961588104658L;@Overridepublic boolean isEnabled() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic String getUsername() {return username;}@Overridepublic String getPassword() {return "pankaj123";}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<SimpleGrantedAuthority> auths = new java.util.ArrayList<SimpleGrantedAuthority>();auths.add(new SimpleGrantedAuthority("admin"));return auths;}};}}

请注意,我正在创建匿名内部类UserDetails并返回它。您可以为它创建一个实现类,然后实例化并返回它。通常这是实际应用程序的方式。

Spring安全示例WebSecurityConfigurer实现

我们可以实现WebSecurityConfigurer接口,或者我们可以扩展基础实现类WebSecurityConfigurerAdapter并覆盖方法。

SecurityConfig.java


package com.journaldev.webapp.spring.security;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import com.journaldev.webapp.spring.dao.AppUserDetailsServiceDAO;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(AuthenticationManagerBuilder auth)throws Exception {// in-memory authentication// auth.inMemoryAuthentication().withUser("pankaj").password("pankaj123").roles("USER");// using custom UserDetailsService DAO// auth.userDetailsService(new AppUserDetailsServiceDAO());// using JDBCContext ctx = new InitialContext();DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");final String findUserQuery = "select username,password,enabled "+ "from Employees " + "where username = ?";final String findRoles = "select username,role " + "from Roles "+ "where username = ?";auth.jdbcAuthentication().dataSource(ds).usersByUsernameQuery(findUserQuery).authoritiesByUsernameQuery(findRoles);}@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring()// Spring Security should completely ignore URLs ending with .html.antMatchers("/*.html");}}

请注意,我们通过重写configure(WebSecurity web)方法忽略所有HTML文件。

该代码显示了如何插入JDBC身份验证。我们需要通过提供DataSource来配置它。由于我们使用自定义表,因此我们还需要提供选择查询以获取用户详细信息及其角色。

配置内存和基于DAO的身份验证很简单,它们在上面的代码中进行了注释。您可以取消注释以使用它们,确保一次只有一个配置。

@Configuration@EnableWebSecurity注释是必需的,因此spring框架知道这个类将用于spring安全配置。

Spring Security Configuration使用的是Builder Pattern,并且基于authenticate方法,稍后将无法使用某些方法。例如,auth.userDetailsService()返回实例UserDetailsService然后我们不能有任何其他选项,例如我们不能在它之后设置DataSource。

将Spring Security Web与Servlet API集成

最后一部分是将Spring Security配置类集成到Servlet API中。这可以通过扩展AbstractSecurityWebApplicationInitializer类并在超类构造函数中传递Security配置类来轻松完成。

SecurityWebApplicationInitializer.java


package com.journaldev.webapp.spring.security;import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;public class SecurityWebApplicationInitializer extendsAbstractSecurityWebApplicationInitializer {public SecurityWebApplicationInitializer() {super(SecurityConfig.class);}
}

当我们的上下文启动时,它使用ServletContext添加ContextLoaderListener监听器并将我们的配置类注册为Servlet Filter。

请注意,这仅适用于Servlet-3投诉servlet容器。因此,如果您使用的是Apache Tomcat,请确保其版本为7.0或更高版本。

我们的项目准备就绪,只需将它部署在您最喜欢的servlet容器中。我正在使用Apache Tomcat-7来运行此应用程序。

下图显示了各种情况下的响应。

如果要使用不支持Servlet规范3的Servlet容器,则需要DispatcherServlet通过部署描述符进行注册。有关WebApplicationInitializer更多详细信息,请参阅JavaDoc 。

这就是Spring Security示例教程以及它在基于Servlet的Web应用程序中的集成。请从下面链接下载示例项目并使用它来了解更多信息。

下载Spring Servlet安全项目

转载来源: https://www.journaldev.com/2715/spring-security-example-tutorial

Spring安全示例教程相关推荐

  1. Spring Batch示例教程

    Spring Batch示例教程 欢迎使用Spring Batch示例.Spring Batch是一个用于执行批处理作业的弹簧框架模块.我们可以使用spring批处理来处理一系列作业. 目录[ 隐藏  ...

  2. Spring Security 示例教程

    Spring Security 示例教程 Spring Security提供了在Web应用程序中执行身份验证和授权的方法.我们可以在任何基于servlet的Web应用程序中使用spring secur ...

  3. Spring IoC,Spring Bean示例教程

    Spring IoC,Spring Bean示例教程 欢迎来到Spring IoC示例教程.Spring Framework基于Inversion of Control原理.依赖注入是在应用程序中实现 ...

  4. Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration

    Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration Spring Framework是基于两 ...

  5. Spring Security示例教程

    Spring Security provides ways to perform authentication and authorization in a web application. We c ...

  6. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

  7. Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

    LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft针对Windows的LDAP实现)是另一种广泛使用的LDAP服务器. 在许多项 ...

  8. Spring AMQP ActiveMQ教程

    Spring AMQP ActiveMQ教程 欢迎使用Spring AMQP ActiveMQ教程.之前我们研究过安装Apache ActiveMQ服务器.今天我们将创建一个Spring应用程序来使用 ...

  9. Spring JDBC 示例

    Spring JDBC示例 Spring JDBC是本教程的主题.数据库是大多数企业应用程序不可或缺的一部分.因此,当谈到Java EE框架时,与JDBC的良好集成非常重要. 目录[ 隐藏 ] 1 S ...

最新文章

  1. 白话hash和数字签名,保证你看得懂
  2. java采集温湿度水浸_配电室水浸及温湿度监测系统可加强环境保障
  3. poj1061-青蛙的约会(拓展欧几里得java)
  4. 计算机二级c选择题题库,C程序设计选择题题库【2018计算机二级考试题库:《C++》选择题练习】...
  5. python高级编程知识点_(转)python 高级编程技巧学习笔记
  6. 来自山西机器人乐队_格力:中国第一支工业机器人乐队重磅亮相
  7. 苦逼了6年,我今天终于把老板开了!哼!
  8. c语言学习-求1+2+3+…+100的和存入变量sum中,并将sum打印出来
  9. word转换php方法,PHP实现Word转换PDF的方法
  10. C++冒泡排序(初级版)
  11. springboot项目引入图片_SpringBoot集成阿里云OSS图片上传
  12. FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay
  13. 论文1:《基于FPGA的机器学习硬件加速研究进展》阅读笔记
  14. 电脑浏览器打不开html文档,电脑浏览器打不开本地html文件
  15. 计算机无法关闭开机密码,电脑开机密码怎么取消
  16. 中国cdn服务升级成就免费备案
  17. 基于SpringCloud的enum枚举值国际化处理实践
  18. 无法删除文件 数据错误 循环冗余检查
  19. Tomcat启动报Exception in thread “main“ java.lang.UnsatisfiedLinkError: no secure-tomcat in java.library
  20. Git使用:在Git pull时遇到的Error及解决方法

热门文章

  1. Memcache安装 2
  2. Node.js Domain 模块
  3. Cookie禁用了,Session还能用吗?
  4. html5游戏制作入门系列教程(七)
  5. Swift中文教程(六)函数
  6. shell编程:对话 UNIX: 更多 shell 脚本技术
  7. UITouch 触摸事件处理(实例)
  8. ansible笔记汇总
  9. Leetcode算法题(C语言)5--存在重复
  10. 【AI视野·今日NLP 自然语言处理论文速览 第二十二期】Mon, 27 Sep 2021