论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
移动端开发
›
IOS
›
SpringSeurity中文文档(Servlet Pre-Authentication Sc ...
SpringSeurity中文文档(Servlet Pre-Authentication Scenarios)
王國慶
论坛元老
|
2024-7-20 08:32:51
|
显示全部楼层
|
阅读模式
楼主
主题
1053
|
帖子
1053
|
积分
3163
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
Pre-Authentication Scenarios
示例包罗 X.509、Siteminder 以及 Java EE 容器中的身份验证,应用步伐在这些环境中运行。当使用预身份验证时,Spring Security 必须实行以下操作:
辨认发出请求的用户。
为用户获取权限。
详细的细节取决于外部认证机制。在 X.509 的情况下,用户大概通过他们的证书信息来辨认,大概在 Siteminder 的情况下,通过 HTTP 请求头辨认。如果依赖容器认证,用户是通过调用传入 HTTP 请求的 getUserPrincipal() 方法来辨认的。在某些情况下,外部机制大概为用户提供脚色和权限信息。然而,在其他情况下,您必须从单独的泉源获取权限,例如 UserDetailsService。
Pre-Authentication Framework Classes
由于大多数预认证机制遵循相同的模式,Spring Security 有一组类,用于实现预认证身份验证提供步伐的内部框架。这消除了重复,并答应以布局化的方式添加新的实现,而无需从头开始编写所有内容。如果您想使用像 X.509 认证这样的东西,您不必要知道这些类,因为它已经有了一个更简单、更易于使用的定名空间配置选项。如果您必要使用显式 bean 配置,大概筹划编写自己的实现,您必要了解提供的实现是如何工作的。您可以在 org.springframework.security.web.authentication.preauth 下找到这些类。我们在这里只提供一个大纲,因此您应该得当地查阅 Javadoc 和源代码。
AbstractPreAuthenticatedProcessingFilter
这个类查抄安全上下文当前的内容,如果为空,则尝试从 HTTP 请求中提取用户信息并将其提交给 AuthenticationManager。子类重写以下方法以获取这些信息。
Override AbstractPreAuthenticatedProcessingFilter
protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);
复制代码
调用这些方法后,过滤器将创建一个包罗返回数据的 PreAuthenticatedAuthenticationToken 并提交举行身份验证。在这里,“身份验证”现实上只是指进一步的 processing,大概会加载用户的权限,但是遵循尺度的 Spring Security 身份验证架构。
与其他 Spring Security 身份验证过滤器一样,预身份验证过滤器有一个 authenticationDetailsSource 属性,默认情况下,它创建一个 WebAuthenticationDetails 对象来存储额外的信息,比如会话标识符和原始 IP 地址,这些信息存储在 Authentication 对象的 details 属性中。在可以从预身份验证机制获取用户脚色信息的情况下,数据也会存储在这个属性中,详细信息实现了 GrantedAuthoritiesContainer 接口。这使得身份验证提供者能够读取外部分配给用户的权限。我们接下来看一个详细的例子。
J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource
如果过滤器配置了 authenticationDetailsSource,且是本类的一个实例,权限信息将通过为每个预定义的“可映射脚色”集合调用 isUserInRole(String role) 方法来获取。该类从配置的 MappableAttributesRetriever 获取这些信息。大概的实现包罗在应用步伐上下文中硬编码一个列表,以及从 web.xml 文件中的 信息读取脚色信息。预身份验证示例应用步伐使用了后一种方法。
还有一个额外的阶段,其中使用配置的 Attributes2GrantedAuthoritiesMapper 将脚色(或属性)映射到 Spring Security GrantedAuthority 对象。默认情况下,它只是在名称前加上通常的 ROLE_ 前缀,但这为您提供了完全控制行为的能力。
PreAuthenticatedAuthenticationProvider
预认证提供者除了为用户加载 UserDetails 对象外,险些没有更多的事变要做。它通过委托给一个 AuthenticationUserDetailsService 来完成这项工作。后者与尺度的 UserDetailsService 雷同,但它接受一个 Authentication 对象而不仅仅是用户名:
public interface AuthenticationUserDetailsService {
UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
}
复制代码
这个接口大概还有其他用途,但是,在预认证中,它答应访问封装在 Authentication 对象中的权限,正如我们在上一节中看到的。PreAuthenticatedGrantedAuthoritiesUserDetailsService 类就是这样做的。大概,它可以通过 UserDetailsByNameServiceWrapper 实现委派给一个尺度的 UserDetailsService。
Http403ForbiddenEntryPoint
AuthenticationEntryPoint 负责为未经认证的用户启动认证过程(当他们尝试访问受保护的资源时)。然而,在预认证的情况下,这并不适用。只有当您不将预认证与其他认证机制结合使用时,您才必要配置 ExceptionTranslationFilter 与此类的一个实例。如果用户被 AbstractPreAuthenticatedProcessingFilter 拒绝,导致认证为 null,则会调用它。如果被调用,它总是返回一个 403-克制的响应码。
Concrete Implementations
X.509 认证在其自己的章节中有所涉及。在这里,我们查看一些为其他预认证场景提供支持的类。
Request-Header Authentication (Siteminder)
外部认证系统大概通过在 HTTP 请求上设置特定头部来向应用步伐提供信息。这种机制的闻名示例是 Siteminder,它通过一个名为 SM_USER 的头部传递用户名。这种机制由 RequestHeaderAuthenticationFilter 类支持,它只从头部提取用户名。默认情况下,它使用 SM_USER 作为头部名称。请参阅 Javadoc 以获取更多详细信息。
Siteminder Example Configuration
下面的示例演示使用此筛选器的典型配置:
<security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>
复制代码
我们在这里假设正在使用安全定名空间举行配置。还假设您已经向配置中添加了一个 UserDetailsService(名为 “userDetailsService”),以加载用户的脚色。
Java EE Container Authentication
J2eePreAuthenticatedProcessingFilter 类从 HttpServletRequest 的 userPrincipal 属性中提取用户名。使用这个过滤器通常必要结合使用 Java EE 脚色,正如前面在 J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 中所描述的。
在代码库中有一个使用这种方法的示例应用步伐,因此如果您感兴趣,可以从 Github 获取代码并查看应用步伐上下文文件。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
王國慶
论坛元老
这个人很懒什么都没写!
楼主热帖
webman
Jupyter Notebook,太强大了
不想打开 IDE 的摆烂一天
React技巧之发出http请求
【Shashlik.EventBus】.NET 事件总线, ...
【网络】https单向认证和双向认证 ...
APP内存管理
Bluecmsv1.6-代码审计
java如何显示"html转义字符"对应的原始 ...
Apache DolphinScheduler 3.0.0 正式版 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
超融合
物联网
SQL-Server
MES
程序人生
分布式数据库
鸿蒙
前端开发
快速回复
返回顶部
返回列表