Spring Security第1部分–具有数据库的简单登录应用程序

什么是Spring Security?

Spring Security是一个提供安全解决方案的框架,可在Web请求级别和方法级别上处理身份验证和授权。 Spring安全性通过两种方式处理安全性。 一种是安全的Web请求,另一种是在URL级别限制访问。 Spring Security使用Servlet过滤器。

在这篇文章中,我将创建一个处理登录身份验证和授权的简单Web应用程序。

下载项目: http : //www.mediafire.com/?bb9x88uxvkb0uuv或http://dl.dropbox.com/u/7215751/JavaCodeGeeks/SpringSecurityTutorialPart1/spring-security-login-example.rar

在创建项目之前,需要对mysql执行一些查询以创建一个新的数据库,表并添加一些示例数据。

创建表

CREATE DATABASE IF NOT EXISTS `spring-test`;  -- create user  CREATE USER 'user'@'localhost' IDENTIFIED BY 'test';  GRANT ALL ON spring-test.* TO 'user'@'localhost';  USE `spring-test`;  CREATE TABLE USER_DETAILS (  USERNAME VARCHAR(10) NOT NULL,  PASSWORD VARCHAR(32) NOT NULL,  PRIMARY KEY (USERNAME)  );  CREATE TABLE USER_AUTH (  USERNAME VARCHAR(10) NOT NULL,  AUTHORITY VARCHAR(10) NOT NULL,  FOREIGN KEY (USERNAME) REFERENCES USER_DETAILS(USERNAME)  );

测试数据

insert into USER_DETAILS values ('user','123');  insert into USER_DETAILS values ('admin','admin');  insert into USER_AUTH values ('user', 'ROLE_USER');  insert into USER_AUTH values ('admin', 'ROLE_ADMIN');

之后,我使用maven创建一个Web项目,并将以下依赖项添加到pom.xml中

<properties><spring.version>3.0.5.RELEASE</spring.version>
</properties>
<dependencies>  <dependency>  <groupId>javax.validation</groupId>  <artifactId>validation-api</artifactId>  <version>1.0.0.GA</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-core</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-web</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-webmvc</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-jdbc</artifactId>  <version>${spring.version}</version>  </dependency>  <!-- Spring Security -->  <dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-core</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-web</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-config</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-taglibs</artifactId>  <version>${spring.version}</version>  </dependency>  <dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-acl</artifactId>  <version>${spring.version}</version>  </dependency>  <!-- jstl -->  <dependency>  <groupId>javax.servlet</groupId>  <artifactId>jstl</artifactId>  <version>1.2</version>  </dependency>  <!-- MySQL database driver -->  <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>5.1.9</version>  </dependency>  <dependency>  <groupId>c3p0</groupId>  <artifactId>c3p0</artifactId>  <version>0.9.1</version>  </dependency>  </dependencies>

之后,像这样更改web.xml

<!DOCTYPE web-app PUBLIC  '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'  'http://java.sun.com/dtd/web-app_2_3.dtd' >  <web-app>  <display-name>spring-security-login</display-name>  <servlet>  <servlet-name>login</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>  <servlet-name>login</servlet-name>  <url-pattern>/</url-pattern>  </servlet-mapping>  <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>  <param-name>contextConfigLocation</param-name>  <param-value>  /WEB-INF/login-servlet.xml,  /WEB-INF/login-security.xml,  /WEB-INF/login-service.xml  </param-value>  </context-param>  <!-- 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>  <welcome-file-list>  <welcome-file>login.jsp</welcome-file>  </welcome-file-list>  </web-app>

现在,我需要创建login-servlet.xml,login-security.xml和login-service.xml弹簧配置文件。 在此示例中,我们将c3p0连接池与Mysql数据库一起使用。

这是login-servlet.xml文件

<?xml version='1.0' encoding='UTF-8'?>  <beans xmlns='http://www.springframework.org/schema/beans'  xmlns:context='http://www.springframework.org/schema/context'  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'>  <context:component-scan base-package='rd.controller'/>  <bean id='internalResourceResolver'  class='org.springframework.web.servlet.view.InternalResourceViewResolver'>  <property name='prefix' value='/WEB-INF/views/'/>  <property name='suffix' value='.jsp'/>  </bean>  <bean class='org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping'></bean>  <bean class='org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter'/>  <bean id='placeholderConfig'  class='org.springframework.beans.factory.config.PropertyPlaceholderConfigurer'>  <property name='locations'>  <list>  <value>classpath:login.properties</value>  </list>  </property>  </bean>  </beans>

这是login-security.xml

<?xml version='1.0' encoding='UTF-8'?>  <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-3.0.xsd  http://www.springframework.org/schema/security  http://www.springframework.org/schema/security/spring-security-3.0.xsd'>  <beans:import resource='login-service.xml'/>  <http>  <intercept-url pattern='/home*' access='ROLE_USER,ROLE_ADMIN' />  <intercept-url pattern='/admin*' access='ROLE_ADMIN' />  <form-login login-page='/login.jsp' default-target-url='/home' authentication-failure-url='/login.jsp?error=true'/>  <logout logout-success-url='/login.jsp' />  <anonymous username='guest' granted-authority='ROLE_GUEST'/>  <remember-me/>  </http>  <authentication-manager>  <authentication-provider>  <!--<user-service>-->  <!--<user name='admin' password='secret' authorities='ROLE_ADMIN,ROLE_USER' />-->  <!--<user name='user1' password='1111' authorities='ROLE_USER' />-->  <!--</user-service>-->  <jdbc-user-service data-source-ref='dataSource'  users-by-username-query='select username,password, 'true' as enabled from USER_DETAILS where username=?'  authorities-by-username-query='select USER_DETAILS.username , USER_AUTH.AUTHORITY as authorities from USER_DETAILS,USER_AUTH  where USER_DETAILS.username = ? AND USER_DETAILS.username=USER_AUTH.USERNAME '/>  </authentication-provider>  </authentication-manager>  </beans:beans>

这是login-service.xml

<beans xmlns='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-3.0.xsd'>  <bean id='dataSource' class='com.mchange.v2.c3p0.ComboPooledDataSource'>  <!--Driver name to connect to the database-->  <property name='driverClass'>  <value>${login.jdbc.driver}</value>  </property>  <!--DB URL-->  <property name='jdbcUrl'>  <value>${login.url}</value>  </property>  <!--DB User used to connect to the schema-->  <property name='user'>  <value>${login.username}</value>  </property>  <!--Password required to access for the above user-->  <property name='password'>  <value>${login.password}</value>  </property>  <!-- configuration pool via c3p0-->  <property name='acquireIncrement'>  <value>${login.c3p0.acquireIncrement}</value>  </property>  <property name='idleConnectionTestPeriod'>  <value>${login.c3p0.idleConnectionTestPeriod}</value>  <!-- seconds -->  </property>  <property name='maxPoolSize'>  <value>${login.c3p0.maxPoolSize}</value>  </property>  <property name='maxStatements'>  <value>${login.c3p0.maxStatements}</value>  </property>  <property name='minPoolSize'>  <value>${login.c3p0.minPoolSize}</value>  </property>  <property name='initialPoolSize'>  <value>${login.c3p0.initialPoolSize}</value>  </property>  <property name='maxIdleTime'>  <value>${login.c3p0.maxIdleTime}</value>  </property>  <property name='acquireRetryAttempts'>  <value>${login.c3p0.acquireRetryAttempts}</value>  </property>  <property name='acquireRetryDelay'>  <value>${login.c3p0.acquireRetryDelay}</value>  </property>  <property name='breakAfterAcquireFailure'>  <value>${login.c3p0.breakAfterAcquireFailure}</value>  </property>  </bean>  </beans>

login.jsp页面如下所示。 (需要放置在webapp目录下。但不在WEB_INF目录下)

<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>  <html>  <head>  <title>Login</title>  </head>  <body>  <c:if test='${not empty param.error}'>  <font color='red'>  Login error. <br />  Reason : ${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message}  </font>  </c:if>  <form method='POST' action='<c:url value='/j_spring_security_check' />'>  <table>  <tr>  <td align='right'>Username</td>  <td><input type='text' name='j_username' /></td>  </tr>  <tr>  <td align='right'>Password</td>  <td><input type='password' name='j_password' /></td>  </tr>  <tr>  <td colspan='2' align='right'>  <input type='submit' value='Login' />  </td>  </tr>  </table>  </form>  </body>  </html>

home.jsp页面

<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>  <%@ taglib prefix='sec' uri='http://www.springframework.org/security/tags' %>  <html>  <head>  <title>Home</title>  </head>  <body>  <a href=<c:url value='/j_spring_security_logout'/>>Logout</a><br/>  <sec:authorize ifAnyGranted='ROLE_ADMIN'>  <h1>Only admin can see this</h1><br/>  <a href='admin'> Admin Home </a>  </sec:authorize>  <h1>Welcome</h1>  </body>  </html>

admin-home.jsp页面

<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>  <%@ page contentType='text/html;charset=UTF-8' language='java' %>  <html>  <head>  <title>Admin</title>  </head>  <body>  <a href=<c:url value='/j_spring_security_logout'/>>Logout</a><br/>  <h1>Only Admin allowed here</h1>  </body>  </html>

之后,您需要编写两个控制器来检索主页和admin-home页面。 这是HomeController.java

package rd.controller;  import org.springframework.stereotype.Controller;  import org.springframework.ui.Model;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RequestMethod;  @Controller  public class HomeController {  @RequestMapping(value = '/home' , method = RequestMethod.GET)  public String setUp(Model model){  return 'home';  }  }

这是AdminController.java

package rd.controller;  import org.springframework.stereotype.Controller;  import org.springframework.ui.Model;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RequestMethod;  @Controller  public class AdminController {  @RequestMapping(value = '/admin' , method = RequestMethod.GET)  public String setUp(Model model){  return 'admin-home';  }  }

而已。 运行mvn clean install命令创建war文件。 将war文件复制到tomcat / webapps目录下,然后在您喜欢的浏览器中访问该Web应用程序。
网址:本地主机:<端口> /spring-login/login.jsp

测试案例1:尝试使用用户名123和密码登录。 您将获得用户主页。
测试案例2:尝试使用admin作为用户名admin作为密码登录。 您将获得带有可见管理页面链接的用户主页。

在Spring安全性第2部分中,我将修改此项目并添加“记住我”功能和md5密码加密功能。

在不久的将来,Ill会尝试发布有关CAS集成和LDAP集成的Spring安全性的有趣文章。 敬请关注 :)

参考: Spring Security第1部分–与我们的JCG合作伙伴 Rajith Delantha在带有Rajith…博客的Looping博客中的数据库简单登录应用程序 。


翻译自: https://www.javacodegeeks.com/2012/07/spring-security-part-1-simple-login.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机应用 winxp,2017年职称计算机考试模块WindowsXP试题

2017年职称计算机考试模块WindowsXP试题全国专业技术人员计算机应用能力考试是专业技术人员资格考试的一种。接下来应届毕业生小编为大家搜索整理了2017年职称计算机考试模块WindowsXP试题&#xff0c;希望大家有所帮助。1. Windows XP中删除某个文件的快捷方式【 A 】。A. 对原…

Python基础(8)_迭代器、生成器、列表解析

一、迭代器 1、什么是迭代 1 重复   2 下次重复一定是基于上一次的结果而来 1 l[1,2,3,4] 2 count0 3 while count < len(l): 4 print(l[count]) 5 count1 迭代举例2、可迭代对象 可进行.__iter__()操作的为可迭代对象 #print(isinstance(str1,Iterable)),判断str…

Angularjs2-EXCEPTION: Response with status: 200 Ok for URL:

利用jsonp跨域请求数居&#xff0c;报错 core.umd.js:3070 EXCEPTION: Response with status: 200 Ok for URL: 参考&#xff1a;stackoverflow 未解决。。。脑仁疼。。。有小伙伴也碰到过这个问题么&#xff1f; 16/11/30 问题解决 1.服务器端API允许跨域访问(返回的数据添加允…

图片无法删除要计算机管理员,存在桌面的图片删不掉,怎么处理?提示是需要管理员权限。...

将下面代码复制到记事本里&#xff0c;重命名为1.bat&#xff0c;然后打开&#xff0c;这时你右键图片会出现管理员取得所有权&#xff0c;然后取得所有权后再删除试试Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]管理员取得所有权NoWorkingDirecto…

Java对象序列化的本机C / C ++类似性能

您是否曾经希望过像使用C 这样的本地语言将Java对象转换成字节流一样快的速度&#xff1f; 如果您使用标准的Java序列化&#xff0c;您可能会对性能感到失望。 Java序列化的目的是与尽可能快而紧凑地序列化对象的目的截然不同。 为什么我们需要快速紧凑的序列化&#xff1f; 我…

WebStrom Sass 编译配置 windows

第一步&#xff1a; 先安装Ruby下载 一路next 安装完成后打开开始菜单 打开后输入 gem install sass sass -v 出现版本号说明成功 第二部配置webstorm 在webstorm中settings中搜索file watchers工具&#xff0c;在此工具中添加一个scss的watcher 确定&#xff0c;打开一个scss…

非本地跳转之setjmp与longjmp

非本地跳转(unlocal jump)是与本地跳转相对应的一个概念。 本地跳转主要指的是类似于goto语句的一系列应用&#xff0c;当设置了标志之后&#xff0c;可以跳到所在函数内部的标号上。然而&#xff0c;本地跳转不能将控制权转移到所在程序的任意地点&#xff0c;不能跨越函数&am…

清华计算机自主招生试题,2017年清华大学自主招生笔试题

2017年清华大学自主招生笔试题2017高考结束后&#xff0c;全国各大高校自主招生面试开始了&#xff0c;以下是百分网小编搜索整理的关于2017年清华大学自主招生笔试题&#xff0c;供各位参考&#xff0c;希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!…

扩展剂:模式还是反模式?

扩展器模式在最近几年变得很流行&#xff0c;甚至已经在OSGi标准&#xff08;例如&#xff0c;蓝图服务和Web应用程序规范&#xff09;中使用。 在处女座&#xff0c;我们从一开始就与扩展程序一起工作&#xff0c;但是尽管它们具有优势&#xff0c;但它们仍有一些明显的缺点。…

python html格式编码

web应用如用到ace等网络编辑器的时候&#xff0c;如要支持html,xml等格式的文件编辑&#xff0c;输入ace 的文本内容必须先进行html格式编码&#xff1a; def html_escape(content): import cgi return cgi.escape(content)转载于:https://www.cnblogs.com/zhouxiaoming/p/703…

字符串替换

题目: 给定一个英文的字符串, 要求你将其中的元音删除掉, 返回新的字符串. 例如:"This website is for losers LOL!" --> "Ths wbst s fr lsrs LL!" 当看到这个题目的时候, 第一个想起的就是re模块的正则表达式. 不过由于最近使用过字符串的replace方…

小学计算机技术指导纲要,《中小学信息技术课程指导纲要(试行)》

《中小学信息技术课程指导纲要(试行)》2000年11月教育部颁发的《中小学信息技术课程指导纲要(试行)》教学目标&#xff1a;1、 增强信息意识&#xff0c;了解信息技术的发展变化及其对工作和社会的影响。2、 初步了解计算机基本工作原理&#xff0c;学会使用与学习和实际生活直…

JavaFX 2.0布局窗格– FlowPane和TilePane

FlowPanes和TilePanes是不错的布局窗格&#xff0c;如果您想一个接一个地连续地水平或垂直地布局子级&#xff0c;则可以。 它们彼此非常相似&#xff0c;因为它们都将子级布置成列&#xff08;在水平Flow / TilePane的情况下&#xff09;并按其宽度或行&#xff08;在垂直Flow…

EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务

本文转自EasyDarwin开源团队成员Penggy的博客&#xff1a;http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwin在录播服务器EasyRMS过程中,我采用node作为EasyRMS录播服务器录播管理服务器的开发平台,基于node开发关于设备管理,录像计划,录…

windows10搭建django1.10.3+Apache2.4

很多教程都是在linux上搭建&#xff0c;windows上似乎天生不太适合&#xff0c;但是我还是愿意试试这个坑。 首先 交代一下自己的环境 python3.5.2 64位 django 1.10.3 apache 2.4 64位 windows 10 重点在apache上。 python 和django 相信有兴趣看这篇文章的基本上也都已经了解…

深入理解计算机系统 视频教程,深入理解计算机系统1

第一章 计算机系统漫游代码段的生命周期hello.c#include int main(){printf("hello world!\n");return 0;}1.1 前序源程序(源文件)实际上就是一个由0和1组成的位(又成比特bit)序列,8个位被组组成一组,称为字节。每个字节表示程序中的某些文本字符(大部分的现代计算机…

Java与iOS对话:Java对象与Apple plist序列化

我很高兴地宣布我的第一个开源项目java-plist-serializer可以帮助您将Java&#xff08;尤其是基于Spring的应用程序&#xff09;与iOS应用程序集成。 背景 我正在将Java Webapp作为后端并且客户端是iOS设备的项目。 最近&#xff0c;我收到了创建Web服务的任务&#xff0c;该服…

web.cofing(新手必看)

花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法。很适合新手参看&#xff0c;由于Web.config在使用很灵活&#xff0c;可以自定义一些节点。所以这里只介绍一些比较常用的节点。 <?xml version"1.0"?> <!--注意: 除了手动编辑此文件以外&…

MIPS下CPU和RAM的数据流动情况详解

这是计算机硬件间的数据路径&#xff08;即数据流动的路径&#xff09;&#xff0c;下面将较详细分析此图&#xff1a; PC&#xff08;program counter&#xff0c; 程序计数器&#xff09;是一个用于记录当前计算机正在执行的指令的地址的寄存器&#xff08;register&#xff…

计算机乱程序怎么办,我的电脑程序乱了怎么办

我的电脑程序乱了&#xff0c;想用光盘恢复一下系统的修复安装方法第一种方法&#xff1a;1、点击“开始”菜单&#xff0c;点击“运行”2、输入CMD回车3、输入命令SFC/SCANNOW4、插入系统光盘系统会自动将硬盘中的系统文件于系统盘中的文件比较并进行修复如果不行&#xff0c;…