如何在没有 XML 配置的情况下定义自定义 AuthenticationEntryPoint

     2023-02-27     89

关键词:

【中文标题】如何在没有 XML 配置的情况下定义自定义 AuthenticationEntryPoint【英文标题】:How to define a custom AuthenticationEntryPoint without XML configuration 【发布时间】:2014-09-01 07:35:18 【问题描述】:

我这几天一直在苦苦挣扎。我是 Spring Boot 的新手,喜欢不使用 XML 配置的想法。

我创建了一个 RESTfull 应用程序(使用 JSON)。我正在关注this tutorial 正确配置身份验证。

我想我设法使用 Java 配置重现了几乎所有的配置,除了一件事 - AuthenticationEntryPoint

本教程使用http标签中的一个属性,并以如下方式定义一个formLogin

<http entry-point-ref="restAuthenticationEntryPoint">

  <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>

  <form-login
     authentication-success-handler-ref="mySuccessHandler"
     authentication-failure-handler-ref="myFailureHandler"
  />

  <logout />

</http>

Spring Security manual 中的 AuthenticationEntryPoint 解释说:

AuthenticationEntryPoint 可以使用 元素上的 entry-point-ref 属性来设置。

没有提及如何使用 Java 配置。

那么我如何在没有 XML 的情况下“注册”我自己的 restAuthenticationEntryPoint 以防止在使用 formLogin 时重定向到登录表单?

下面我会提到我尝试过的。

谢谢大家。


在我的尝试中,发现您可以像这样使用 basicAuth 来定义它:

@Configuration
@Order(1)                                                        
public static class RestWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 


        if (restAuthenticationEntryPoint == null) 
            restAuthenticationEntryPoint = new RestAuthenticationEntryPoint();
        

        http
            .authorizeRequests()
                .antMatchers("/**").hasAnyRole(Sec.ADMIN,Sec.SUPER_USER)
...
        .and()
            .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)

但我正在使用这样的表单登录(没有 httpBasic 部分):

        .and()
            .formLogin()
                .successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
                .failureHandler(simpleUrlAuthenticationFailureHandler)

问题是它在没有收到凭据时重定向到登录表单。由于这是一项 REST 服务,因此不应该这样做。

FormLoginConfigurer 的 documentation(.formLogin() 使用的类)说:

已创建共享对象

以下共享对象被填充

AuthenticationEntryPoint

但找不到覆盖它的方法。 有什么想法吗?

附言 不要认为将登录表单覆盖为只返回错误的自定义表单是一个好主意。

【问题讨论】:

为什么你有 REST 资源的表单登录?通常一个表单意味着你有一个 GUI(因此重定向到一个视图页面)。也许 HTTP Basic 就是你所需要的? 感谢您的回答。我需要 formLogin 以便拥有一个 cookie,而不是在每个请求上发送凭据。前端是 JavaScript(其实是 angularJS),我不喜欢在客户端存储用户名和密码的想法 我明白了。你会得到一个用于任何身份验证的 cookie,所以这不一定是一个很好的理由。此外,浏览器可能会为您处理基本身份验证(我假设)。 据我所见,如果我创建一个登录页面并使用基本身份验证与其余服务“对话”,浏览器不会“处理”它。我不得不到处传递凭据。也许我做错了什么。 检查 HTTP 流量。如果您从登录页面获得一个 cookie,那么浏览器应该会在每个后续请求中发送它。 【参考方案1】:

您提供的参考文档中的引用指向您http.exceptionHandling()。您可以在那里设置共享入口点。

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);

【讨论】:

这行得通。太感谢了。顺便一提。我找不到教程在哪里讨论 exceptionHandling,而是 RestAuthenticationEntryPoint 的开始方法中的一个参数。你是怎么注意到的? 我的意思是:您在哪里找到教程中对异常处理的引用,该引用引导您找到答案。但实际上这只是一个“哇”的评价。 :) 我没有按照教程进行操作。当您了解 API 时,它与 XML 相同,所以我猜到了,但我敢打赌,您可以在 Security ref docs 中找到它。 似乎 Spring Security Reference 没有提到 exceptionHandling() 方法,让用户自己去解决这个问题。 参考中好像没有直接出现,但是可以在Spring文档中找到几个例子:Example 1Example 2

SpriteKit:如何在没有 SKShapeNode 的情况下绘制自定义形状?

】SpriteKit:如何在没有SKShapeNode的情况下绘制自定义形状?【英文标题】:SpriteKit:HowtodrawcustomshapeswithoutSKShapeNode?【发布时间】:2016-08-0623:39:11【问题描述】:从Apples对SKShapeNode的类参考以及许多开发人员那里,我听说使用SKShapeNo... 查看详情

如何在没有自定义单元格的情况下将文本包装在 UITableViewCell 中

】如何在没有自定义单元格的情况下将文本包装在UITableViewCell中【英文标题】:HowdoIwraptextinaUITableViewCellwithoutacustomcell【发布时间】:2008-09-2420:00:03【问题描述】:这是在iPhone0S2.0上。2.1的答案也很好,但我不知道关于表格的任... 查看详情

如何在没有范围的情况下在 laravel 路由中使用自定义键?

】如何在没有范围的情况下在laravel路由中使用自定义键?【英文标题】:Howtousecustomkeysinlaravelrouteswithoutscoping?【发布时间】:2020-06-2413:47:59【问题描述】:当使用自定义键时,Laravel会强制我们进行范围界定,例如,我有一条获... 查看详情

如何在没有额外自定义代码的情况下强制使正在运行的 Cocoa 程序失效?

】如何在没有额外自定义代码的情况下强制使正在运行的Cocoa程序失效?【英文标题】:HowcanIforceinvalidationofarunningCocoaprogramwithoutadditionalcustomcode?【发布时间】:2009-09-0121:31:09【问题描述】:我的Cocoa程序中有多个自定义NSView。我... 查看详情

如何在没有地图视图的情况下在自定义图像上显示用户位置

】如何在没有地图视图的情况下在自定义图像上显示用户位置【英文标题】:Howtoshowuserlocationonacustomimagewithoutamapview【发布时间】:2014-11-0418:56:53【问题描述】:我有一个区域的自定义Photoshop图片。它大部分是矩形的,所以我用... 查看详情

如何在没有第三方库的情况下创建自定义幻灯片菜单。?

】如何在没有第三方库的情况下创建自定义幻灯片菜单。?【英文标题】:Howtocreatecustomslidemenuwithoutthirdpartylibrary.?【发布时间】:2016-05-0507:44:45【问题描述】:我想在我的iOS应用程序中实现滑动菜单,例如抽屉(Andriod)。我经历... 查看详情

如何在不使用 _layouts 目录的情况下配置自定义页面?

】如何在不使用_layouts目录的情况下配置自定义页面?【英文标题】:Howtoprovisionacustompagewithoutusingthe_layoutsdirectory?【发布时间】:2010-10-1115:01:48【问题描述】:我需要提供一个自定义aspx页面,该页面会做一些工作,然后重定向... 查看详情

iOS - 如何在没有第三方框架的情况下在 Swift 中创建自定义动画横幅

】iOS-如何在没有第三方框架的情况下在Swift中创建自定义动画横幅【英文标题】:iOS-HowtocreatecustomanimatedbannerwithoutthirdpartyframeworkinSwift【发布时间】:2020-09-0318:17:09【问题描述】:我需要创建一个自定义下拉横幅,该横幅将从顶... 查看详情

在没有自定义单元格的情况下向 uitableview 显示详细信息披露按钮

...thoutcustomcell【发布时间】:2010-03-0806:26:06【问题描述】:如何在不使用自定义单元格的情况下向uitableview显示详细信息披露按钮。我通过使用附件类型:方法知道它,但不知道如何实现..请帮助..【问题讨论】:【参考方案1】: 查看详情

如何在没有 SDK 或自定义应用程序 ID 的情况下创建 Facebook 分享按钮?

】如何在没有SDK或自定义应用程序ID的情况下创建Facebook分享按钮?【英文标题】:HowcreateaFacebooksharebuttonwithoutSDKorcustomappid?【发布时间】:2014-10-2411:48:11【问题描述】:我在看latestupdatetoFacebook\'ssharebutton.如果不包含Facebookjavascrip... 查看详情

如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?

】如何在没有调用者UUID的情况下从自定义UI结束CallKit调用?【英文标题】:HowtoendaCallKitcallfromcustomUIwithouthavingcallerUUID?【发布时间】:2020-11-0415:25:43【问题描述】:我正在开发iOSSwift5中的视频通话应用程序,其中通话只能从后端... 查看详情

如何在没有 Firebase 和自定义后端的情况下使用 Flutter 设置推送通知

】如何在没有Firebase和自定义后端的情况下使用Flutter设置推送通知【英文标题】:HowtosetupPushNotificationswithFlutterwithoutFirebaseandwithowncustombackend【发布时间】:2019-08-2815:44:52【问题描述】:我一直在开发一个带有reactnative的应用程序... 查看详情

如何在没有邮件接收客户端的情况下验证 Mandrill 自定义发送域?

】如何在没有邮件接收客户端的情况下验证Mandrill自定义发送域?【英文标题】:HowtoverifyMandrillcustomsendingdomainwithoutamailreceivingclient?【发布时间】:2015-12-1607:36:19【问题描述】:背景我使用Mandrill作为我的SMTP发送邮件服务器。在... 查看详情

如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?

】如何在没有Jquery-ui且没有Bootstrap的情况下在angularjs中创建自定义进度条?【英文标题】:HowtocreatecustomprogressbarinangularjsWithoutJquery-uiandwithoutBoostrap?【发布时间】:2017-07-2007:07:37【问题描述】:我正在尝试在Angularjs中创建进度条... 查看详情

如何在 log4j2.xml 配置中使用 armeria 的 RequestContext 自定义属性?

】如何在log4j2.xml配置中使用armeria的RequestContext自定义属性?【英文标题】:HowtouseRequestContextcustomattributesofarmeriainlog4j2.xmlconfiguration?【发布时间】:2021-05-0913:26:06【问题描述】:我正在使用log4j22.14.0和armeria1.3.0。根据armeria文档,... 查看详情

没有 web.xml 的 Spring Security 自定义身份验证过滤器

】没有web.xml的SpringSecurity自定义身份验证过滤器【英文标题】:Springsecuritycustomauthenticationfilterwithoutweb.xml【发布时间】:2013-09-1801:02:13【问题描述】:使用注解和java配置,我不太清楚如何为spring安全性注册一个覆盖的过滤器。... 查看详情

如何在没有 oauth 但使用 angular 和 dotnet 自定义实现的情况下安全地发送 clientid 和 clientsecret

】如何在没有oauth但使用angular和dotnet自定义实现的情况下安全地发送clientid和clientsecret【英文标题】:Howtosecurelysendclientidandclientsecretwithoutoauthbutcustomimplementationwithangularanddotnet【发布时间】:2021-07-0605:17:10【问题描述】:我有一... 查看详情

如何在没有 xml 的 Spring 中运行方面? [关闭]

】如何在没有xml的Spring中运行方面?[关闭]【英文标题】:HowrunaspectinSpringwithoutxml?[closed]【发布时间】:2017-05-0210:47:35【问题描述】:如何在Java中运行切面。如何在Spring中使用注解运行切面,而无需xml文件?许多其他教程使用xml... 查看详情