spring security 重定向登录时端口 8080 来自哪里?如何将其更改为使用端口 443?
Posted
技术标签:
【中文标题】spring security 重定向登录时端口 8080 来自哪里?如何将其更改为使用端口 443?【英文标题】:Where is the port 8080 coming from when spring security redirects to login? How can I change it to use port 443? 【发布时间】:2019-12-11 12:33:09 【问题描述】:在我的应用程序中,当一个 URL 在 requestMap 中列为“IS_AUTHENTICATED_FULLY”时,spring security 会拦截并重定向到我们的登录。这是应该的。但是,spring security 正在将 ':8080' 添加到登录 url,它不应该这样做。我需要弄清楚如何修改spring security配置参数,使生成的登录url不包含端口(或包含默认端口)。
当非登录用户输入类似如下的url时会出现问题:
https://whitelabel.innocentive.com/ar/workspace/index
Spring 安全拦截并重定向到登录。 url 生成看起来像这样(注意端口 8080):
https://whitelabel.innocentive.com:8080/ar/login/index
我在 config.groovy 文件中添加了我认为正确的配置参数(见下文)。不幸的是,我仍然在生成的 url 中得到 :8080
当用户尚未登录时会发生这种情况。 (如果已经成功登录,则没有问题。)我们使用RequestmapConfig.groovy作为我们的requestmaps,它是在启动时加载的。以下是相关的行:
grails
//Login required
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/board/removesubscription/**'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/board/workspace/**'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/projectroom/index/**'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/workspace/index/**'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/federatedLogin/index'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/challenge/newChallenge'])
checkCreateRequestmap([configAttribute: 'IS_AUTHENTICATED_FULLY', url: '/solverCenter/**'])
但是,我认为真正的问题是 spring security 没有正确获取配置参数。以下是从 config.groovy 获取的 spring 安全参数(httpPort 和 httpsPort 是最后添加的两个:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'PersonAuthority'
grails.plugin.springsecurity.authority.className = 'Authority'
grails.plugin.springsecurity.requestMap.className = 'Requestmap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'
grails.plugin.springsecurity.active = true
grails.plugin.springsecurity.successHandler.defaultTargetUrl = '/login/loginRedirection'
// alwaysUseDefaultTargetUrl=false
grails.plugin.springsecurity.auth.loginFormUrl = "/login/index"
grails.plugin.springsecurity.logout.afterLogoutUrl = '/logout/confirmation'
grails.plugin.springsecurity.adh.errorPage = null
// removing these config as we want the default bcrypt algorithm
//grails.plugin.springsecurity.password.algorithm = 'SHA' // Ex. MD5 SHA
//grails.plugin.springsecurity.password.encodeHashAsBase64 = false
//grails.plugin.springsecurity.password.hash.iterations = 1
grails.plugin.springsecurity.userLookup.passwordPropertyName = 'passwd'
grails.plugin.springsecurity.userLookup.accountExpiredPropertyName = null
grails.plugin.springsecurity.userLookup.accountLockedPropertyName = null
grails.plugin.springsecurity.userLookup.passwordExpiredPropertyName = null
grails.plugin.springsecurity.logout.postOnly = false
//grails.plugin.springsecurity.useSessionFixationPrevention = false
grails.plugin.springsecurity.apf.storeLastUsername = true
grails.plugin.springsecurity.rejectIfNoRule = false
grails.plugin.springsecurity.fii.rejectPublicInvocations = false
// added to cause a new jsessionid to be created after login
grails.plugin.springsecurity.useSessionFixationPrevention=true
grails.plugin.springsecurity.sessionFixationPrevention.migrate=false
grails.plugin.springsecurity.sessionFixationPrevention.alwaysCreateSession=true
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
我本来希望 spring security 生成一个带有端口 443 而不是端口 8080 的 url: https://whitelabel.innocentive.com:8080/ar/login/index
只是一些背景信息:我们的应用程序曾经侦听端口 8080,但我们最近已迁移到 AWS 云。我们的 IT 已将应用程序置于侦听 80 和 443 的负载均衡器后面。他们不想将 8080 添加到侦听端口列表中。
【问题讨论】:
我认为分辨率可能与此处描述的非常相似:***.com/questions/25455969/…(我在第一次切换时错过了这个)我们的 IT 发现关闭 ProxyPreserveHost 可以解决问题,但显然我们不希望将其作为最终解决方案,它只是确认我们在正确的区域。我现在的问题是我不知道在 grail 应用程序中声明 server.use-forward-headers 的位置...... application.properties 似乎是错误的。 config.groovy 中应该是 grails.server.useForwardHeaders = true 吗? 【参考方案1】:仅为可能遇到相同问题的人发布此内容。通过将以下内容添加到我们的 tomcat server.xml 中,我们的问题得到了解决:
<Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="172\.31\.\d1,3\.\d1,3" remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" httpsServerPort="x-forwarded-port" />
我们的 grails 应用程序不需要更改配置,但我们的 Apache 配置确实让 ProxyPreserveHost 重新打开。
(一个小提示,如果我们需要设置 server.use-forward-headers,application.properties 是设置它的正确位置,尽管我最初有所保留。
【讨论】:
以上是关于spring security 重定向登录时端口 8080 来自哪里?如何将其更改为使用端口 443?的主要内容,如果未能解决你的问题,请参考以下文章
Spring security *always* 重定向到登录表单
Grails Spring Security 使用 https 重定向到登录页面