Grails: как связать пользователя SAML с пользователем приложения? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть приложение Grails 2.4, работающее с spring-security-core 2.0, никаких проблем. У меня есть пользователи в доменном классе с именем Person, с его полномочиями, группами ... как обычно.

Теперь мне нужно перейти к аутентификации SAML. Я тестирую с этим онлайн IDP:

https://samltest.id/

Я наконец-то вошел в систему с помощью SAML и перешел к моей заявке.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, хотя процесс входа в систему выполняется с помощью SAMP IDP, мне все еще нужны пользователи моего приложения для управления разрешениями и другими характеристиками внутри моего приложения.

Итак, я пытаюсь получить имя пользователя currentUser, а затем с помощью:

def user = Person.findByUsername(xxxx) 

получите моего соответствующего пользователя приложения (имена пользователей будут одинаковыми в SAML и моем приложении).

Я не знаю, существует ли какой-то автоматический способ сделать это, например, передать пользователей SAML пользователям в доменном классе, связанном с каким-то механизмом spring-security-core. Если есть, скажите, пожалуйста.

В любом случае, проблема в том, что я не могу восстановить имя пользователя текущего пользователя. Я пробовал это:

def user = springSecurityService.currentUser
print user
print user?.username

С результатами:

grails.plugin.springsecurity.userdetails.GrailsUser@9722b877: Username: AAdzZWNyZXQxjUG6pddUdMdIAMXFuA9E/rDtTg93QsL1PYrP40B34mLtKeh35b7VKlqQz1nFHYb2GWY/pVTmKvxVA0183NL02GWr7aBkWTwk7jedHK99rZdpAOrdM70OR8qMy39A9z/TAHqN; Password: [PROTECTED]; Enabled: false; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Not granted any authorities            

AdzZWNyZXQxjUG6pddUdMdIAMXFuA9E/rDtTg93QsL1PYrP40B34mLtKeh35b7VKlqQz1nFHYb2GWY/pVTmKvxVA0183NL02GWr7aBkWTwk7jedHK99rZdpAOrdM70OR8qMy39A9z/TAHqN

Это:

def principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal()
print principal
print principal.getUsername()

С теми же результатами, что и раньше

А это:

def credentials = SecurityContextHolder.getContext().getAuthentication().getCredentials()
print credentials.getAttributeAsString("username")    

В результате «Нет подписи метода getAttributeAsString ...»

Строка текста, которую я получаю как имя пользователя, кажется случайной, так как она меняется каждый раз, когда я вхожу в систему, хотя я всегда вхожу в систему с одним и тем же пользователем.

Я полагаю, что это поведение может измениться в зависимости от IDP, и, возможно, фактический IDP, который мне нужно будет использовать, отвечает с именем пользователя в открытом виде, но что, если нет? Я думаю, что то, что мне нужно, довольно типично, SAML может управлять аутентификацией, но вам все равно нужно знать, кто вы пользователь приложения. Как вы можете узнать это, если ВПЛ не скажет вам?

Я оставляю здесь свою конфигурацию SAML, если это может помочь:

BuildConfig.groovy:

dependencies {


    compile('org.opensaml:opensaml:2.6.1') {
        excludes 'commons-codec', 'commons-collections', 'commons-lang', 'esapi', 'jcip-annotations', 'jcl-over-slf4j', 'joda-time', 'jul-to-slf4j', 'junit', 'log4j-over-slf4j', 'logback-classic', 'openws', 'serializer', 'servlet-api', 'slf4j-api', 'spring-core', 'spring-mock', 'testng', 'velocity', 'xalan', 'xercesImpl', 'xml-apis', 'xml-resolver', 'xmlunit'
    }

    compile('org.opensaml:xmltooling:1.3.4') {
        excludes 'bcprov-jdk15', 'commons-codec', 'jcip-annotations', 'jcl-over-slf4j', 'joda-time', 'jul-to-slf4j', 'junit', 'log4j-over-slf4j', 'logback-classic', 'not-yet-commons-ssl', 'serializer', 'slf4j-api', 'testng', 'xalan', 'xercesImpl', 'xml-apis', 'xml-resolver', 'xmlsec', 'xmlunit'
    }

    compile('org.opensaml:openws:1.4.4') {
        excludes 'commons-codec', 'commons-httpclient', 'jcip-annotations', 'jcl-over-slf4j', 'joda-time', 'jul-to-slf4j', 'junit', 'log4j-over-slf4j', 'logback-classic', 'serializer', 'servlet-api', 'slf4j-api', 'spring-core', 'spring-mock', 'testng', 'xalan', 'xercesImpl', 'xml-apis', 'xml-resolver', 'xmltooling', 'xmlunit'
    }

    compile 'commons-collections:commons-collections:3.2.1'

    compile('org.springframework.security.extensions:spring-security-saml2-core:1.0.0.RC2') {
        excludes 'spring-security-core'
        excludes 'spring-security-web'
    }
}

plugins {

    compile ':spring-security-saml:2.0.0'
    compile ":spring-security-core:2.0.0"

}

Config.groovy

grails.plugin.springsecurity.saml.active = true

grails.plugin.springsecurity.logout.filterProcessesUrl = "/saml/SingleLogout"
grails.plugin.springsecurity.providerNames = ["samlAuthenticationProvider"]
grails.plugin.springsecurity.useSwitchUserFilter = true

grails.plugin.springsecurity.saml.metadata.sp.defaults = [
  alias : 'localhost:dev:MyApp',
  entityBaseURL: 'http://localhost:8088/MyApp'
]

sp.xml

<?xml version="1.0" encoding="UTF-8"?>
  <md:EntityDescriptor entityID="localhost:dev:MyApp" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata">
    <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:Extensions>
      <idpdisco:DiscoveryResponse xmlns:idpdisco="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Binding="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Location="http://localhost:8088/MyApp/spring-security-saml/login/auth/"/>
    </md:Extensions>
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>
MIIC9jCCArSgAwIBAgIETo67pDALBgcqhkjOOAQDBQAwXjELMAkGA1UEBhMCVUsxEDAOBgNVBAgT
B1Vua25vd24xDzANBgNVBAcTBmxvbmRvbjENMAsGA1UEChMEYnVyYjENMAsGA1UECxMEYnVyYjEO
MAwGA1UEAxMFZmVyb3owHhcNMTExMDA3MDg0MzE2WhcNMTIwMTA1MDg0MzE2WjBeMQswCQYDVQQG
EwJVSzEQMA4GA1UECBMHVW5rbm93bjEPMA0GA1UEBxMGbG9uZG9uMQ0wCwYDVQQKEwRidXJiMQ0w
CwYDVQQLEwRidXJiMQ4wDAYDVQQDEwVmZXJvejCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OB
HXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/y
ZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq
7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7
+jrqgvlXTAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4r
s6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKB
gQDKBDz1DFPPmmWp9n1FskJOev7CnnVFsKji1NLUDdifvS+uW+cnvnDfD3yPdxzUeknCrPTBRp+B
IvYUvLQ57LMIuLgKQ12RujGl0Oz9JbFMAHuBV2I/7ZykzGQPysSEqKCqG+kDc8VZ4AfIf/S8YnQk
xqdWQ5jLTIzXvcWd0WEYbDALBgcqhkjOOAQDBQADLwAwLAIUGP/oZpi79ZM1793XzZvnmrnmz5gC
FBm4bDN8h/0hAa83jaD8joLr098I
            </ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SingleLogout"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SingleLogout"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SingleLogout"/>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</md:NameIDFormat>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SSO" index="0" isDefault="true"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SSO" index="1" isDefault="false"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Location="http://localhost:8088/MyApp/spring-security-saml/saml/SSO" index="2" isDefault="false"/>
  </md:SPSSODescriptor>
</md:EntityDescriptor>
...