Java中使用Spring security(一)

本文介绍了Java程序中的权限安全问题,特别是Spring Security的使用。Spring Security是一个强大的Java安全解决方案,适用于基于Spring框架的Web应用程序。文章详细阐述了Spring Security的认证和授权过程,以及如何在Web应用程序中集成Spring Security,包括配置过滤器、保护资源、自定义登录页面等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们今天新开一篇课题,分析一下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>标签中,您需要定义filter-namefilter-class,就像为应用程序定义servlet-nameservlet-class一样。只不过这里filter-namefilter-class是固定的。

<filter-mapping>标记中,您可以定义应该通过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才能访问。

而security:authentication-manager主要是用来处理登陆认证过程。比如:如何校验你输入的用户名/密码是正确的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值