您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Java中使用Spring-security(一)

我们今天新开一篇课题,分析一下java程序中的权限安全问题,Spring Security是什么,如何在程序中集成Spring Security。

背景

阅读本文你应该熟悉基本的Core Java,J2EE和Spring MVC的知识。

什么是Spring Security?

这是一个基于Java的安全解决方案。它主要适用于基于Spring框架构建的基于Java的Web应用程序。它为基于J2EE的企业软件应用程序提供全面的安全服务。它功能强大,灵活性更高。您可以非常轻松地将spring安全服务插入到您的应用程序中。

认证和授权是Spring Security中包含的两个主要操作。

1.身份验证是要求用户提供有效凭据来验明正身。
2.授权意味着验证登录用户对此应用程序具有哪些(或)特权。

Spring Security集成在您的应用程序中

在进入本文之前,我们先简要介绍一下Web应用程序的工作原理。

在Web应用程序中,执行过程通常如下。

  • 客户端在浏览器中输入URL请求Web页面。
  • 然后请求到达一个Servlet容器(例如Tomcat)
  • Servlet容器根据web.xml配置,查找到对应的处理程序servlet。
  • 然后,将请求发送到对应的Servlet
  • Servlet处理完请求将响应发回到Servlet容器
  • 最后,Servlet 容器将该响应发送到网络,最终被客户端Web浏览器接收到。

在这个过程中,J2EE中引入了Interceptor的概念。让您可以拦截或过滤Servlet容器和Servlet之间的请求,这样在请求到达Servlet之前,您可以执行一些预处理和后处理作业。

例如,您可以执行一些安全性操作,日志记录,甚至可以根据请求的类型或请求所来自的客户端类型将请求重定向到另一个URI。

有了以上的理论,下面我们就来看看一个案例:如何在您的解决方案中集成Spring Security以构建用户登录门户。

还是Web应用程序为例,用户只要在Web浏览器中输入并执行Web应用程序的URL,就会首先打开一个Login页面。用户必须输入他/她的登录凭据并提交它们进行身份验证。如果身份验证成功,则用户将被带到应用程序主页。如果身份验证失败,则用户将被带回登录页面。

注意这里我将重点介绍通过Spring Security配置中定义的硬编码用户名进行身份验证。然后我将向您展示如何使用Spring Security通过数据库开发身份验证。

现在让我们看看如何使用Spring Security实现此应用程序逻辑。

Spring安全设置:

首先,您需要下载spring security依赖jar。以下是需要下载的3个基本jar,可以为基本身份验证和Web应用程序身份验证执行spring-security。

spring-security-config-3.2.7-RELEASE.jar
spring-security-core-3.2-RELEASE .jar
spring-security-web-3.2-RELEASE .jar

spring-security中还有其他jar提供其他高级身份验证技术,例如:LDAP身份验证,OpenID身份验证,身份验证中的实现记住我选项等。但在这里,我将重点关注Web应用程序身份验证。

在servlet配置xml文件或应用程序上下文xml中,您需要在*<beans …>标记的xsi:schemaLocation*中指定以下URL 。

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xmlns:security="http://www.springframework.org/schema/security"

    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-3.1.xsd">
....
....
....
</beans>

要启用Spring Security,您需要将以下过滤器添加到/WEB-INF/web.xml。

<!-- Enable 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>

因此,在*标签中,您需要定义filter-namefilter-class*,就像为应用程序定义servlet-nameservlet-class一样。只不过这里filter-namefilter-class是固定的。

在**标记中,您可以定义应该通过spring安全性检查的路径,一般是个正则表达式。

springSecurityFilterChain过滤器即DelegatingFilterProxy,就是servlet对应委托的过滤器和拦截器。拦截器内部进行我们的特殊动作,如:身份验证,授权。

Spring安全配置:

您需要在应用程序上下文xml文件(或servlet config xml文件)中的*<beans …> … </ beans>*标记下定义以下标记。

<security:http auto-config="true" use-expressions="true">
    <!-- Interceptor urls -->
    <security:intercept-url pattern="/login**" access="permitAll" />
    <security:intercept-url pattern="/resources/**" access="permitAll" />
    <security:intercept-url pattern="/**" access="hasRole('USER')" />
    <security:intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
    
    <security:form-login />
            
    <!-- Logout -->
    <security:logout logout-success-url="/logout" />
</security:http>

在*<security:http …>标记内,添加要保护的资源。如上所示,我使用<security:intercept-url>标记定义了四个拦截器*。

在这里,我配备了几种校验,哪些URL允许所有用户(包括匿名用户)访问,哪些URL仅限于某些用户角色访问。

例如:

在上面的代码片段中“/login”,“/ resources /”路径开头的任何页面,都可以被包括匿名用户在内的所有人访问。

而“/ admin”路径,只有具备ADMIN角色的用户才可以访问,依此类推…

Spring-securitydh 提供了一个默认的内置登录页面,其中有两个文本框用于输入用户名和密码,还有一个提交按钮用于提交凭据以进行验证。您无需为应用程序设计登录表单。一旦用户在其浏览器上打开应用程序URL,spring-security将检查用户是否未登录,然后将用户重定向到spring-security提供的默认登录表单。

如果需要自定义登录页面,则可以将spring-security配置为使用自定义登录页面。您可以使用<security:form-login>标记在<security:http> … </ security:http>标记内定义自定义登录表单页面。以下是配置示例。

<security:http auto-config="true" use-expressions="true">

    <security:intercept-url pattern="/login**" access="permitAll" />
    <security:intercept-url pattern="/resources/**" access="permitAll" />
    <security:intercept-url pattern="/**" access="hasRole('USER')" />
    <security:intercept-url pattern="/admin**" access="hasRole('ADMIN')" />

    <!-- Login Form -->
    <security:form-login 

        login-page="/login"

        default-target-url="/"

        authentication-failure-url="/login?error=1" 

        username-parameter="username"

        password-parameter="password" />
         
    <!-- Logout -->
    <security:logout logout-success-url="/logout" />
        
</security:http>

在<security:form-login …>标记中,

  • 在“login-page”中,您可以指定自定义登录页面URL路径。
  • 在“default-target-url”中,您可以指定用户在成功登录后应该导航的URL。
  • 在“authentication-failure-url”中,您可以指定用户在登录失败后应该导航的URL。
  • “username-parameter”和“password-parameter” - 这两个是可选的。默认情况下,spring-security在登录表单中接受参数名称“j_username”和“j_password”作为用户名和密码。如果要在登录表单中为用户名和密码输入字段指定任何其他名称,则可以在<security:form-login …>标记中的这两个属性中指定自定义参数名称。

在<security:logout …>标记中,

  • 在“logout-success-url”中,您可以指定在用户在退出登陆后,应该跳向哪个页面URL路径。

在</ security:http>标记结束后,您需要添加以下标记,即<security:authentication-manager>。这适用于身份验证管理器。

<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="stitis" password="mindfire" authorities="USER" />
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

根据我们前面概述,为了安全,在用户请求到达Servlet之前,或者说在请求到达Spring Dispatcher Servlet之前, 我们需要进行身份验证和授权检查的预处理和后期处理。此段代码片断便是这个目的。

在上面的代码片段中,<security:authentication-manager>,*<security:authentication-provider><security:user-service>*用于身份验证。

<security:authentication-manager>用于绑定UserDetailServices*即用户信息库检查,并获得用户的身份和授予的权限。而前面的<security:http>是指用于安全检查或授权。

这就是Spring Security的基础设置和配置部分。 下一篇我们将讲述一些Spring Security的高级内容

思考:

security:http组件与security:authentication-manager组件的职责各是什么?

答:

security:http主要用来配置权限与资源的对应配置,比如访问一个资源url的条件,是需要什么role才能访问。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进