springsecurityxml配置网站详解版权声明

原创
小哥 3年前 (2022-11-08) 阅读数 42 #大杂烩

6. Security Namespace Configuration

6.1 Introduction

自2.0版本的 spring 自框架以来,命名空间配置已可用。 它允许您从其他位置使用。XML图案元素与传统元素相辅相成Spring beans应用程序上下文语法。 您可以在Spring在参考文件中查找更多信息。 命名空间元素可以简单地用于配置单个bean或者更有力地定义替代配置语法,以更紧密地匹配问题域,并向用户隐藏潜在的复杂性。 一个简单的元素可以隐藏多个bean以及将处理步骤添加到应用程序上下文的事实。 例如,将开始从安全命名空间向应用程序上下文添加以下元素。 嵌入式 LDAP服务器,以便在应用程序中 测试 使用:

<security:ldap-server />

这相当于布线。Apache目录服务器bean简单得多。 提出了最常见的替代配置要求ldap-server元素上的属性是受支持的,用户无需担心要创建什么。bean以及bean属性名称。编辑应用程序上下文文件时使用良好。XML编辑器应提供有关可用属性和元素的信息。我们建议您尝试Spring工具套件,因为它有使用标准Spring命名空间的特殊函数。

要开始在应用程序的上下文中使用安全命名空间,您需要在类路径上使用它们。 spring-security-config jar。 然后,您只需要将模式声明添加到应用程序上下文文件中:


    ...

在许多示例中,您将看到(在示例应用程序中)我们通常使用“security作为默认命名空间,而不是beans“这意味着我们可以省略所有安全命名空间元素的前缀来制作内容。 更容易阅读。 如果您的应用程序上下文被划分为多个单独的文件,并且其中一个文件中包含大部分安全配置,那么您可能也需要这样做。 然后,您的安全应用程序上下文文件将以如下方式开始:


    ...

我们将假设从现在起本章将使用此语法。

6.1.1 Design of the Namespace

命名空间旨在捕获框架的最常见用法,并提供简化和简洁的语法,以便在应用程序中启用它们。 设计基于框架内的大规模依赖关系,可分为以下几部分:

  • Web / HTTP安全 - 最复杂的部分。设置筛选器和相关服务。bean,对于应用程序框架身份验证机制,安全URL、呈现登录页和错误页等等。
  • 业务对象(方法)安全性 - 保护服务层的选项。
  • AuthenticationManager - 处理来自框架其他部分的身份验证请求。
  • AccessDecisionManager - 提供Web以及方法安全访问决策。默认值将被注册,但您也可以选择使用使用普通值的自定义值。Spring bean语法声明。
  • AuthenticationProviders - 身份验证管理器对用户进行身份验证的机制。命名空间提供了对几个标准选项的支持,并添加了使用传统语法声明的自定义。bean的方法
  • UserDetailsService - 与身份验证提供者密切相关,但通常需要其他bean。

我们将在以下几节中学习如何配置这些。

6.2 Getting Started with Security Namespace Configuration

在本节中,我们将向您展示如何构建命名空间配置以使用框架的一些主要功能。 让我们假设您最初希望尽快启动并运行现有的。Web该应用程序添加了身份验证支持和访问控制,并执行一些测试登录。 然后,我们将看看如何转换为对。 数据库 或其他用于身份验证的安全存储库。 在后面的小节中,我们将介绍更高级的命名空间配置选项。

6.2.1 web.xml Configuration

您需要做的第一件事是将以下过滤器语句添加到您的过滤器语句中。 web.xml 文件:


springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy



springSecurityFilterChain
/*

这提供了一种方法Spring Security Web基础设施挂钩。 DelegatingFilterProxy 是一个Spring Framework类,该类被委托给在应用程序上下文中定义为Spring bean。 在这种情况下,bean名为 springSecurityFilterChain ,这是命名空间创建的内部基础结构。bean,用于处理Web安全。 请注意,您不应该自己使用此功能。bean名称。 将其添加到web.xml之后,您可以开始编辑应用程序上下文文件。 Web安全服务使用 <http> 元素配置。

6.2.2 A Minimal Configuration

启用Web安全所需的所有功能都是





它说我们需要所有的应用程序。URL安全且需要角色 ROLE_USER 要访问它们,我们需要使用带有用户名和密码的表单登录到应用程序,然后我们需要注销。URL注册,这将允许我们注销应用程序。 <http> 元素是全部Web相关命名空间功能的父级。 MARKDOWN_HASHe069e60cd691d0d36f948254d5358a02MARKDOWNHASH 元素定义架构,使用ant路径样式语法,与传入请求匹配。URL。您也可以使用正则表达式匹配作为替代(有关详细信息,请参见命名空间附录)。access属性定义了与给定模式匹配的请求的访问要求。对于默认配置,这通常是一个逗号分隔的角色列表,其中必须允许一个用户发出请求。前缀“ROLE\“是一个标记,指示应该对用户的权限进行简单的比较。换句话说,应该使用基于角色的常规检查。 Spring Security中的访问控制不限于使用简单角色(因此前缀用于区分不同类型的安全属性)。我们将在后面解释如何更改脚注:[访问属性中逗号分隔值的解释取决于用途。-1-实施在里面Spring Security 3.0在中,也可以填充此属性。-2-。]

您可以使用多个 <intercept-url> 元素为不同的URL集合定义了不同的访问要求,但按照列出的顺序对其进行求值,并使用第一个匹配项。 所以你必须把最具体的竞争放在首位。 您还可以添加方法属性以限制特定HTTP方法(GET,POST,PUT等等)。

要添加一些用户,可以直接在命名空间中定义一组测试数据:



    
    
    
    

如果您熟悉框架的命名空间预版本,您可能已经猜到了这里发生了什么。 <http> 元素负责创建FilterChainProxy以及它使用的过滤器bean。 由于过滤器位置是预定义的,因此常见问题(如过滤器排序错误)不再是问题。 <authentication-provider> 元素创建 DaoAuthenticationProvider bean<user-service> 元素创建InMemoryDaoImpl。 所有证书提供程序元素必须是 <authentication-manager> 元素的子元素,它创建 ProviderManager 并向其注册认证提供商。 您可以在名称空间附录中找到创建的内容。bean更多详细信息。 如果你想开始学习框架中的重要类以及如何使用它们,这是值得反复检查的,尤其是如果你想在以后定制一些东西。

上面的配置定义了两个用户,他们的密码和他们在应用程序中的角色(将用于访问控制)。 您还可以使用 user-service 上的properties特性从标准特性文件加载用户信息。 有关文件格式的更多详细信息,请参阅内存验证部分。 使用 <authentication-provider> 元素意味着认证管理器将使用用户信息来处理认证请求。 你可以有多个 <authentication-provider> 元素定义不同的身份验证源,并依次进行查询。 此时,您应该能够启动应用程序,并且需要登录才能继续。 试试看,或者试试项目附带的“教程”示例应用程序。

6.2.3 Form and Basic Login Options

当提示您登录时,您可能想知道登录表单的来源,因为我们没有提到HTML文件或JSP。 事实上,因为我们没有明确设置登录页面。URL,Spring Security将自动生成URL并使用处理提交的登录名。URL标准值,用户将使用的默认目标。URL 登录后发送至等。 然而,名称空间提供了大量支持,允许您自定义这些选项。 例如,如果您想提供自己的登录页面,可以使用:





还要注意,我们添加了一个 intercept-url 元素,以指示匿名用户的任何登录页面请求都应可用,并且 AuthenticatedVoter 类可以了解如何处理值。 IS_AUTHENTICATED_ANONYMOUSLY 更多详细信息。 否则,请求将与模式匹配。 /** 并且将无法访问登录页面本身! 这是一个常见的配置错误,将导致应用程序中的无限循环。 如果您的登录页面看起来安全,Spring Security日志中将发出警告。 也可以定义单独的http元素,以便与特定模式匹配的所有请求完全绕过安全过滤器链,如下所示:







从Spring Security 3.1,现在可以使用多个。http元素为不同的请求模式定义了单独的安全过滤器链配置。 如果从http从元素中省略pattern属性,它匹配所有请求。 创建不安全模式是这种语法的一个简单示例,其中模式被映射到空过滤器链。 我们将在安全过滤器链一节中更详细地讨论这个新语法。 重要的是要意识到这些不安全的请求将完全忽略任何Spring Security Web相关配置或其他属性,如requires-channel,因此您将无法在请求期间访问当前用户的信息或调用安全方法。 如果您仍然想应用安全过滤器链,请使用它。

access =IS_AUTHENTICATED_ANONYMOUSLY

如果要使用基本身份验证而不是表单登录,请更改配置




然后,基本身份验证将优先,并将用于在用户尝试访问受保护的资源时提示用户登录。 如果您想使用此配置,表单登录仍然可以用于此配置,例如通过嵌入在另一个网页中的登录表单。

Setting a Default Post-Login Destination

如果您试图在不提示窗体登录的情况下访问受保护的资源,您将使用它。 default-target-url 选项。 这是用户成功登录后将访问的内容。URL,默认值为“/”。 您还可以 always-use-default-target 属性已设置“true这样,用户总是在此页面上结束(无论是“按需”登录还是他们明确选择登录) 。 如果应用程序总是要求用户在主页上启动,这很有用,例如:





为了更好地控制目标,您可以使用 authentication-success-handler-ref 属性作为 default-target-url 的替代。 引用的bean应该是 AuthenticationSuccessHandler 一个实例。 您可以在Core Filters在章节和命名空间附录中查找更多信息,以及有关如何在身份验证失败时自定义流的信息。

6.2.4 Logout Handling

logout元素导航到特定URL添加了对注销的支持。 默认注销URL是 /logout ,但你可以使用它。 logout-url 该属性将其设置为不同的值。 有关其他可用属性的更多信息,请参见命名空间附录。

6.2.5 Using other Authentication Providers

您需要一个更可扩展的用户信息源,而不是向应用程序上下文文件添加多个名称。 您可能希望将用户信息存储在类似的数据库或中。LDAP服务器。 LDAP命名空间在中配置LDAP在本章中讨论过,因此我们在此不再讨论。 如果您有Spring Security的 UserDetailsService 在应用程序上下文中,的自定义实现称为“myUserDetailsService“,那么你就可以用它了。


    

如果您想使用数据库,可以使用它。



    

其中”securityDataSource“在应用程序上下文中。 DataSource bean名称的,指向包含标准Spring Security用户数据表的数据库。 或者,您可以配置Spring Security JdbcDaoImpl bean并指出其用途 user-service-ref 属性的bean:







您您也可以使用标准 AuthenticationProvider beans如下


    

其中 myAuthenticationProvider 在应用程序上下文中实现 AuthenticationProvider 的bean的名称。 您可以使用多个 authentication-provider 元素,在这种情况下,将按照声明它们的顺序查询供应商。 关于如何使用命名空间配置 Spring Security AuthenticationManager 有关详细信息,请参见否。6.6“身份验证管理器和命名空间”一节。

Adding a Password Encoder

密码应始终使用为此目的设计的安全散列。 算法 (不是像SHA或MD5这样的标准算法)进行编码。 这由 <password-encoder> 元件支撑。 使用bcrypt编码的密码,原始身份验证提供程序配置如下所示:





    
    
    
    
    

Bcrypt在大多数情况下都是一个不错的选择,除非你有一个旧的系统迫使你使用不同的算法。 如果您使用简单的哈希算法,或者更糟糕的是,存储纯文本密码,那么您应该考虑迁移到更安全的选项,例如。bcrypt。

6.3 Advanced Web Features

6.3.1 Remember-Me Authentication

有关remember-me有关命名空间配置的信息,请参见Remember-Me章节。

6.3.2 Adding HTTP/HTTPS Channel Security

如果您的应用程序同时支持HTTP和HTTPS你只需要通过。HTTPS访问特定URL,您可以直接使用它。 <intercept-url> 上的requires-channel要支持的属性:




...

配置此配置后,如果用户尝试使用它HTTP访问与”/secure/**“模式匹配他们将首先被重定向的任何内容。HTTPS URL [5]。 可用选项为“http”,”https”或”any”。 使用值”any“表示您可以使用HTTP或HTTPS。

如果您的应用程序使用非标准端口。HTTP和/或HTTPS,您可以指定如下端口映射列表:


...

    

请注意,为了真正的安全,不应使用应用程序。HTTP或在HTTP和HTTPS转换 它应该以HTTPS(用户输入HTTPS URL)启动并使用安全连接,以避免任何中间人攻击的可能性。

6.3.3 Session Management

Detecting Timeouts

您可以配置Spring Security检测无效会话ID并将用户重定向到适当的URL。 这是通过 session-management 实现的:


...

请注意,如果您使用此机制检测会话超时,如果用户注销,然后在不关闭浏览器的情况下重新登录,您可能会错误地报告错误。 这是因为会话cookie当会话到期时,它不会被清除,即使用户已注销,也会重新提交。 您可以在注销时显式删除它。JSESSIONID cookie例如,在注销处理程序中使用以下语法:



不幸的是,这不能保证每个servlet容器一起工作,因此您需要在您的环境中测试它。

如果在代理之后运行应用程序,还可以通过配置代理服务器来删除会话。cookie。 例如,使用Apache HTTPD的 mod_headers ,以下说明将在对注销请求的响应中过期后删除。 JSESSIONID cookie(假设应用程序部署在路径中。) /tutorial ):

始终 set Set-Cookie“JSESSIONID =; Path = / tutorial; Expires = Thu,01 Jan 1970 00:00:00 GMT”

Concurrent Session Control

如果您想限制单个用户登录应用程序的能力,Spring Security支持这种开箱即用的简单添加。 首先,您需要将以下侦听器添加到 web.xml 要制作的文件Spring Security关于会话生命周期事件的更新:



    org.springframework.security.web.session.HttpSessionEventPublisher

然后将以下行添加到应用程序上下文中:


...

    

这将防止用户多次登录。 - 第二次登录将导致第一次登录失败。通常,您希望防止第二次登录,在这种情况下,您可以使用它。


...

    

第二次登录将被拒绝。 “拒绝”表示如果使用基于表单的登录,用户将被发送到 authentication-failure-url 如果第二次身份验证是通过另一种非交互机制(例如“记住我”)进行的,则会向客户端发送“未经授权”(401)错误。 如果要使用错误页,可以使用该属性。 session-authentication-error-url 添加到会话管理元素。 如果您使用自定义身份验证过滤器进行基于表单的登录,则必须显式配置并发会话控制支持。 有关更多详细信息,请参阅会话管理一章。

Session Fixation Attack Protection

会话固定攻击是一种潜在风险,恶意攻击者可以通过访问站点创建会话,然后说服其他用户登录同一会话(通过发送包含会话标识符作为参数的链接)。 例)。 Spring Security通过创建新会话或在用户登录时以其他方式更改会话。ID为了自动防止这种情况。如果您不需要这种保护或与其他一些要求冲突,您可以使用它。 session-fixation-protection 属性 <session-management> ,其中有四个选项

  • none - 什么都不要做。保留原始会话。
  • newSession - 创建新的“清理”会话,而不复制现有会话数据(Spring Security相关属性仍将被复制)。
  • migrateSession - 创建新会话并将所有现有会话属性复制到新会话。这是Servlet 3.0或早期容器中的默认值。
  • changeSessionId - 不要创建新会话。并且应该使用Servlet容器提供的会话固定保护 ( HttpServletRequest#changeSessionId() ). 此选项仅在Servlet 3.1(Java EE 7)然后装在容器中。在旧容器中指定它将导致异常。这是Servlet 3.1以及更新的容器中的默认值。

当发生会话固定保护时,会导致在应用程序上下文中发布。 SessionFixationProtectionEvent 。 如果使用 changeSessionId ,此保护还将导致通知 javax.servlet.http.HttpSessionIdListener ,所以如果您的代码同时侦听这两个事件,请小心。 有关更多信息,请参见“session management”一章。

6.3.4 OpenID Support

命名空间支持 OpenID 登录,而不是基于普通表单的登录,或者除了基于普通表单登录之外,还有一个简单的更改:




然后,你应该报告OpenID供应商(例如。myopenid.com注册自己并将用户信息添加到内存中。 <user-service>

您应该能够使用 myopenid.com 网站执行登录验证。 它也可以传入 openid-login 设置在元素上 user-service-ref 属性以选择特定 UserDetailsService bean以使用OpenID。 有关更多信息,请参见前面关于身份验证提供程序的部分。 请注意,我们在上述用户配置中省略了密码属性,因为这组用户数据仅用于加载用户的权限。 内部会生成一个随机密码,以防止您意外地将此用户数据用作配置中其他位置的身份验证源。

Attribute Exchange

支持OpenID 属性交换 例如,以下配置将尝试从OpenID提供商检索电子邮件和全名供应用程序使用:



    
    

每个OpenID属性的”type“按特定模式(在本例中 http://axschema.org/ )确定的URI。 如果必须检索属性才能成功身份验证,可以对其进行设置。 required 的属性。 支持的确切模式和属性将取决于您的OpenID供应商。 属性值作为身份验证过程的一部分返回,然后可以使用以下代码访问:

OpenIDAuthenticationToken token =
    (OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List attributes = token.getAttributes();

OpenIDAttribute 包含属性类型和检索到的值(或多值属性的值)。 我们将在技术概述一章中查看。Spring Security核心组件,了解如何使用 SecurityContextHolder 有关该类的更多信息。 如果要使用多个身份提供程序,也支持多个。 attribute-exchange 配置。 您可以为每个元素提供多个属性交换元素。 identifier-matcher 属性。 它包含将随用户提供的内容。OpenID具有匹配标识符的正则表达式。 有关配置示例,请参见代码库中的。OpenID示例应用程序,Google,Yahoo和MyOpenID提供程序提供了不同的属性列表。

6.3.5 Response Headers

有关如何自定义标题元素的其他信息,请参阅参考。20章“安全HTTP响应标题”部分。

6.3.6 Adding in Your Own Filters

如果你以前用过Spring Security,您将知道框架维护一系列过滤器以应用其服务。 您可能希望将自己的过滤器添加到特定位置的堆栈中,或者使用当前没有命名空间配置的选项(例如)。CAS)的Spring Security过滤器。 或者,您可能希望使用标准命名空间过滤器的自定义版本,例如。 <form-login> 元素已创建 UsernamePasswordAuthenticationFilter ,通过显式使用bean其他配置选项可用。 如何使用命名空间配置,因为过滤器链没有直接公开? 使用名称空间时,过滤器的顺序总是严格执行的。 创建应用程序上下文时,过滤器bean按命名空间处理代码排序,标准。Spring Security过滤器在命名空间中有一个别名和一个众所周知的位置。

在以前的版本中,排序是在应用程序上下文的后处理过程中创建过滤器实例之后完成的。 在版本3.0+在中,排序现在在实例化类之前。bean元数据级别完成。 这会影响如何将自己的过滤器添加到堆栈中,因为在解析中。 <http> 在元素期间必须知道整个过滤器列表,因此语法在中。3.0略有变化。

为过滤器创建过滤器、别名和名称空间。elements/attributes如表6.1显示“标准过滤器别名和顺序”。 过滤器按其在过滤器链中出现的顺序列出。

Table 6.1. Standard Filter Aliases and Ordering

Alias

Filter Class

Namespace Element or Attribute

CHANNEL_FILTER

ChannelProcessingFilter

http/intercept-url@requires-channel

SECURITY_CONTEXT_FILTER

SecurityContextPersistenceFilter

http

CONCURRENT_SESSION_FILTER

ConcurrentSessionFilter

session-management/concurrency-control

HEADERS_FILTER

HeaderWriterFilter

http/headers

CSRF_FILTER

CsrfFilter

http/csrf

LOGOUT_FILTER

LogoutFilter

http/logout

X509_FILTER

X509AuthenticationFilter

http/x509

PRE_AUTH_FILTER

AbstractPreAuthenticatedProcessingFilter Subclasses

N/A

CAS_FILTER

CasAuthenticationFilter

N/A

FORM_LOGIN_FILTER

UsernamePasswordAuthenticationFilter

http/form-login

BASIC_AUTH_FILTER

BasicAuthenticationFilter

http/http-basic

SERVLET_API_SUPPORT_FILTER

SecurityContextHolderAwareRequestFilter

http/@servlet-api-provision

JAAS_API_SUPPORT_FILTER

JaasApiIntegrationFilter

http/@jaas-api-provision

REMEMBER_ME_FILTER

RememberMeAuthenticationFilter

http/remember-me

ANONYMOUS_FILTER

AnonymousAuthenticationFilter

http/anonymous

SESSION_MANAGEMENT_FILTER

SessionManagementFilter

session-management

EXCEPTION_TRANSLATION_FILTER

ExceptionTranslationFilter

http

FILTER_SECURITY_INTERCEPTOR

FilterSecurityInterceptor

http

SWITCH_USER_FILTER

SwitchUserFilter

N/A

您可以使用 custom-filter 元素和其中一个名称来指定过滤器的显示位置:





如果要在堆栈中的另一个过滤器之前或之后插入过滤器,也可以使用。 afterbefore 属性。 名称”FIRST”和”LAST”可以与 position 属性一起用于指示您希望过滤器分别出现在整个堆栈之前或之后。

如果您插入的自定义过滤器可能与命名空间创建的标准过滤器占据相同的位置,请务必不要错误地包含命名空间版本。 删除创建过滤器以替换其功能的任何元素。 请注意,您不能使用 <http> 元素本身( SecurityContextPersistenceFilterExceptionTranslationFilterFilterSecurityInterceptor )已创建筛选器。 默认情况下会添加其他过滤器,但您可以禁用它们。 默认情况下,将添加一个。 AnonymousAuthenticationFilter ,除非禁用会话锁定保护,否则为1。 SessionManagementFilter 也将添加到过滤器链中。

如果要替换需要身份验证入口点的命名空间过滤器(即,身份验证过程由试图访问安全资源的未经身份验证的用户触发),还需要添加自定义入口点。bean。

Setting a Custom AuthenticationEntryPoint

如果您没有使用表单登录,OpenID或者,对于命名空间的基本身份验证,您可能希望使用传统的。bean语法定义了身份验证过滤器和入口点,并将它们链接到命名空间,正如我们刚刚看到的。 可以使用 <http> 元素上的 entry-point-ref 该属性设置相应的 AuthenticationEntryPoint 。 CAS示例应用程序是一个带有命名空间的自定义应用程序。bean这是一个很好的语法示例。 如果您不熟悉身份验证入口点,请在“技术概述”一章中进行讨论。

6.4 Method Security

从2.0版本开始,Spring Security对将安全性添加到服务层方法的支持已大大改进。 它提供对JSR-250请注意安全性和原始框架。 @Secured 支持评论。 从3.0,您还可以使用新的基于表达式的注释。 您可以将安全性应用于单个bean,使用 intercept-methods 元素装饰bean声明,也可以使用AspectJ样式入口点跨服务层保护多个。bean。

6.4.1 The global-method-security Element

此元素用于在应用程序中启用基于注释的安全性(通过在元素上设置适当的属性),并在整个应用程序上下文中对安全点切片声明进行分组。 你应该只申报一个 <global-method-security> 元素。 以下语句将支持Spring Security的 @Secured

<global-method-security secured-annotations="enabled" />

向方法(在类或接口上)添加注释将相应地限制对该方法的访问。 Spring Security本机注释支持为方法定义了一组属性。 这些将被传递 AccessDecisionManager 为了做出实际决定:

public interface BankService {

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();

@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}

您可以使用启用对。JSR-250支持评论

<global-method-security jsr250-annotations="enabled" />

这些是基于标准的,允许应用简单的基于角色的约束,但是Spring Security本土评论。要使用新的基于表达式的语法,您将使用它。

<global-method-security pre-post-annotations="enabled" />

和等效的 Java 代码

public interface BankService {

@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);

@PreAuthorize("isAnonymous()")
public Account[] findAccounts();

@PreAuthorize("hasAuthority(ROLE_TELLER)")
public Account post(Account account, double amount);
}

如果您需要定义简单的规则,而不是根据用户的权限列表检查角色名称,那么基于表达式的注释是一个不错的选择。

将仅定义注释的方法。Spring bean实例(在启用方法安全性的同一应用程序上下文中)是安全的。 如果你不想保护Spring创建的实例(例如使用new操作员),然后您需要使用。AspectJ。

您可以在同一应用程序中启用多种类型的注释,但任何接口或类只能使用一种类型,否则将不会显式定义行为。 如果您找到两个适用于特定方法的注释,则只应用其中一个。

Adding Security Pointcuts using protect-pointcut

使用 protect-pointcut 切换功能特别强大,因为它允许您只需一个简单的声明就可以将安全性应用于许多应用程序。bean。 考虑以下示例:



这将保护在应用程序上下文中声明的。bean在类位于的所有方法中 com.mycompan y在包中,其类名为“Service”结尾。 只有具有 ROLE_USER 角色的用户可以调用这些方法。 与URL与匹配一样,最具体的匹配必须位于切入点列表中的第一个,因为将使用第一个匹配表达式。 安全注释优先于入口点。

6.5 The Default AccessDecisionManager

本节假定您是对的。Spring Security中访问控制的底层 架构 有一些理解。 如果不能,您可以跳过它,稍后再回来,因为这一部分与需要进行一些自定义以使用简单的基于角色的安全性的人非常相关。 当您使用命名空间配置时,它将自动为您注册 AccessDecisionManager 的默认实例将基于您所在的位置。 intercept-urlprotect-pointcut 声明中指定的访问属性用于方法调用和。Web URL访问决策 (如果使用注释安全方法,则在注释中)。 默认策略是使用。 RoleVoterAuthenticatedVoterAffirmativeBased AccessDecisionManager 。 您可以在“授权”部分中找到有关这些的更多信息。

6.5.1 Customizing the AccessDecisionManager

如果您需要使用更复杂的访问控制策略,那么很容易做到。Web安全设置的替代方案。 对于方法安全性,您可以传递。 global-method-security 上的 access-decision-manager-ref 该属性在应用程序上下文中设置为相应的。 AccessDecisionManager bean的ID来实现:


...

Web安全语法相同,但在中。 http 元素:


...

6.6 The Authentication Manager and the Namespace

在Spring Security用于在中提供身份验证服务的主接口 AuthenticationManager 。 这通常是Spring Security的 ProviderManager 类的一个实例,如果您以前使用过框架,您可能已经熟悉它了。 如果没有,将在“技术概述”一章后面介绍。 使用 authentication-manager 命名空间元素注册bean实例。 如果您通过命名空间使用它。HTTP或方法安全性,您不能使用自定义 AuthenticationManager ,但这应该不是问题,因为您可以完全控制使用的内容。 AuthenticationProvider 。 您可能希望使用 ProviderManager 注册其他 AuthenticationProvider bean,您可以使用。 ref 属性的 <authentication-provider> 元素执行此操作,其中属性的值是要添加的提供程序。bean的名称。 例如:






...

另一个常见要求是上下文中的另一个bean可能需要参考 AuthenticationManager 。您可以轻松注册 AuthenticationManager 并在应用程序上下文的其他位置使用此名称。


...




...
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门