From 2bd376292155ae33e6fc071e67bf02b80142e2e6 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 10 Mar 2015 17:40:08 +0000 Subject: [PATCH] Reference doc updates --- build.gradle | 1 + docs/src/reference/asciidoc/appendix.adoc | 116 +++++++++++- docs/src/reference/asciidoc/images/ff1.png | Bin 0 -> 35400 bytes docs/src/reference/asciidoc/images/ff2.png | Bin 0 -> 36285 bytes docs/src/reference/asciidoc/images/ff3.png | Bin 0 -> 32884 bytes docs/src/reference/asciidoc/images/ie1.png | Bin 0 -> 15576 bytes docs/src/reference/asciidoc/images/ie2.png | Bin 0 -> 19243 bytes docs/src/reference/asciidoc/index.adoc | 2 +- docs/src/reference/asciidoc/introduction.adoc | 5 +- docs/src/reference/asciidoc/preface.adoc | 5 + docs/src/reference/asciidoc/samples.adoc | 169 +++++++++++++++++ .../asciidoc/samples/AuthProviderConfig.xml | 7 +- .../asciidoc/samples/SpnegoConfig.xml | 92 +++++----- .../kerberos/docs/AuthProviderConfig.java | 92 +++++----- .../kerberos/docs/AuthProviderConfig.xml | 7 +- .../docs/DummyUserDetailsService.java | 35 ++++ .../kerberos/docs/SpnegoConfig.java | 171 +++++++++--------- .../extensions/kerberos/docs/SpnegoConfig.xml | 92 +++++----- spring-security-kerberos-samples/build.gradle | 2 +- 19 files changed, 557 insertions(+), 239 deletions(-) create mode 100644 docs/src/reference/asciidoc/images/ff1.png create mode 100644 docs/src/reference/asciidoc/images/ff2.png create mode 100644 docs/src/reference/asciidoc/images/ff3.png create mode 100644 docs/src/reference/asciidoc/images/ie1.png create mode 100644 docs/src/reference/asciidoc/images/ie2.png create mode 100644 docs/src/reference/asciidoc/samples.adoc create mode 100644 spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/DummyUserDetailsService.java diff --git a/build.gradle b/build.gradle index f622ee5..d28ab20 100644 --- a/build.gradle +++ b/build.gradle @@ -207,6 +207,7 @@ configure(rootProject) { doctype: 'book', numbered: '', 'spring-version' : springVersion, + 'spring-security-version' : springSecurityVersion, revnumber : project.version } diff --git a/docs/src/reference/asciidoc/appendix.adoc b/docs/src/reference/asciidoc/appendix.adoc index 017ab27..e807c49 100644 --- a/docs/src/reference/asciidoc/appendix.adoc +++ b/docs/src/reference/asciidoc/appendix.adoc @@ -3,6 +3,16 @@ :numbered!: +[appendix] +== Material Used in this Document +Dummy UserDetailsService used in samples because we don't have a real +user source. + +[source,java,indent=0] +---- +include::samples/DummyUserDetailsService.java[tags=snippetA] +---- + [appendix] == Crash Course to Kerberos In any authentication process there are usually a three parties @@ -21,7 +31,7 @@ one which really brings everything together and thus is the most critical component in your environment. Because of this it is also considered as a single point of failure. -Initially when `Kerberos` environment is setup and domain users +Initially when `Kerberos` environment is setup and domain user principals created into to a database, encryption keys are also created. These encryption keys are based on shared secrets(i.e. user password) and actual passwords are never kept in a clear text. @@ -32,7 +42,7 @@ Interestingly there is no communication between a `resource` and a image:images/drawio-kerb-cc2.png[] -When client wants to authenticate itself with a resource it first +When client wants to authenticate itself with a `resource` it first needs to communicate with a `KDC`. `Client` will craft a special package which contains encrypted and unencrypted parts. Unencrypted part contains i.e. information about a user and encrypted part other @@ -40,7 +50,7 @@ information which is part of a protocol. `Client` will encrypt package data with its own key. When `KDC` receives this authentication package from a client it -checks who this client claims to be from an unencrypted part and based +checks who this `client` claims to be from an unencrypted part and based on that information it uses `client` decryption key it already have in its database. If this decryption is succesfull `KDC` knows that this `client` is the one it claims to be. @@ -66,8 +76,8 @@ received service ticket to a service which then thinks that I don't know anything about this guy but he have me an authentication ticket. What `service` can do next is try to decrypt that ticket and if that operation is succesfull it knows that only other party who knows my -credentials is the `KDC` and because I trust him I can also trust this -client claiming to be who he is. +credentials is the `KDC` and because I trust him I can also trust that +this client is a one he claims to be. [appendix] == Setup Kerberos Environments @@ -75,6 +85,7 @@ Doing a production setup of Kerberos environment is out of scope of this document but this appendix provides some help to get you started for setting up needed components for development. +[[setupmitkerberos]] === Setup MIT Kerberos First action is to setup a new realm and a database. @@ -144,7 +155,17 @@ policy Enter password for principal "user1@EXAMPLE.ORG": Re-enter password for principal "user1@EXAMPLE.ORG": Principal "user1@EXAMPLE.ORG" created. +---- +If you like you can create a keytab file for this user. + +[source,text,indent=0] +---- +kadmin: ktadd -k /tmp/user1.keytab user1@EXAMPLE.ORG +Entry for principal user1@EXAMPLE.ORG with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/user1.keytab. +Entry for principal user1@EXAMPLE.ORG with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/user1.keytab. +Entry for principal user1@EXAMPLE.ORG with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/user1.keytab. +Entry for principal user1@EXAMPLE.ORG with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/user1.keytab. ---- Lets create a service ticket for tomcat and export credentials to a @@ -164,7 +185,7 @@ Entry for principal HTTP/neo.example.org@EXAMPLE.ORG with kvno 2, encryption typ Entry for principal HTTP/neo.example.org@EXAMPLE.ORG with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/tomcat2.keytab. ---- - +[[setupwinkerberos]] === Setup Windows Domain Controller This was tested using `Windows Server 2012 R2` @@ -214,5 +235,88 @@ PS C:\> ktpass /out c:\tomcat.keytab /mapuser tomcat@EXAMPLE.ORG /princ HTTP/neo This appendix provides generic information about troubleshooting errors and problems. +[IMPORTANT] +==== +If you think environment and configuration is correctly setup, do +double check and ask other person to check possible obvious mistakes +or typos. Kerberos setup is generally very brittle and it is not +always very easy to debug where the problem lies. +==== +[source,text] +---- +GSSException: Failure unspecified at GSS-API level (Mechanism level: +Invalid argument (400) - Cannot find key of appropriate type to +decrypt AP REP - RC4 with HMAC) +---- + +If you see abore error indicating missing key type, this will happen +with two different use cases. Firstly your JVM may not support +appropriate encryption type or it is disabled in your `krb5.conf` +file. + +[source,text] +---- +default_tkt_enctypes = rc4-hmac +default_tgs_enctypes = rc4-hmac +---- + +Second case is less obvious and hard to track because it will lead +into same error. This specific `GSSException` is throws also if you +simply don't have a required encryption key which then may be caused +by a misconfiguration in your kerberos server or a simply typo in your +principal. + +[appendix] +[[browserspnegoconfig]] +== Configure Browsers for Spnego Negotiation + +=== Firefox +Complete following steps to ensure that your Firefox browser is +enabled to perform Spnego authentication. + +- Open Firefox. +- At address field, type *about:config*. +- In filter/search, type *negotiate*. +- Parameter *network.negotiate-auth.trusted-uris* may be set to + default *https://* which doesn't work for you. Replace this with + your server address. + +=== Chrome + +With Google Chrome you generally need to set command-line parameters +order to white list servers with Chrome will negotiate. + +[source,text] +---- +--auth-server-whitelist="*.example.com" +--auth-negotiate-delegate-whitelist="*.example.com" +---- + +You can see which policies are enable by typing *chrome://policy/* +into Chrome's address bar. + +With Linux Chrome will also read policy files from +`/etc/opt/chrome/policies/managed` directory. + +.mypolicy.json +[source,json] +---- +{ + "AuthServerWhitelist" : "*.example.org", + "AuthNegotiateDelegateWhitelist" : "*.example.org", + "DisableAuthNegotiateCnameLookup" : true, + "EnableAuthNegotiatePort" : true +} +---- + +=== Internet Explorer +Complete following steps to ensure that your Internet Explorer browser +is enabled to perform Spnego authentication. + +- Open Internet Explorer. +- Click *Tools > Intenet Options > Security* tab. +- In *Local intranet* section make sure your server is trusted by i.e. + adding it into a list. + diff --git a/docs/src/reference/asciidoc/images/ff1.png b/docs/src/reference/asciidoc/images/ff1.png new file mode 100644 index 0000000000000000000000000000000000000000..97ba5e77a726e286f3870d6571d76af3bd5ad08c GIT binary patch literal 35400 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 literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/ff2.png b/docs/src/reference/asciidoc/images/ff2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3f250ad4b80da2682452ea1495ef198fed8e68 GIT binary patch literal 36285 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 QPiFuEPgg&ebxsLQ0DH~HqW}N^ literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/ff3.png b/docs/src/reference/asciidoc/images/ff3.png new file mode 100644 index 0000000000000000000000000000000000000000..696cd9fca7b2528147035e05f01f319b52492184 GIT binary patch literal 32884 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 literal 0 HcmV?d00001 diff --git a/docs/src/reference/asciidoc/images/ie1.png b/docs/src/reference/asciidoc/images/ie1.png new file mode 100644 index 0000000000000000000000000000000000000000..1fddc2ed874baf62079505c44bf92213eab25990 GIT binary patch literal 15576 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%0ADUd1 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 da8{> describes the usage of Spring Security Kerberos +<> describes the usage of Spring +Security Kerberos Samples + +<> generic support material + diff --git a/docs/src/reference/asciidoc/samples.adoc b/docs/src/reference/asciidoc/samples.adoc new file mode 100644 index 0000000..551f68f --- /dev/null +++ b/docs/src/reference/asciidoc/samples.adoc @@ -0,0 +1,169 @@ +[[springsecuritykerberossamples]] += Spring Security Kerberos Samples + +This part of the reference documentation is introducing samples +projects. Generally samples can be either compiled manually by +building main distribution from +https://github.com/spring-projects/spring-security-kerberos or using +nightly snapshots or actual release builds. + +- http://repo.spring.io/libs-snapshot/org/springframework/security/kerberos/ +- http://repo.spring.io/libs-release/org/springframework/security/kerberos/ + +[IMPORTANT] +==== +If you download and run sample from a maven repo it will not work +until a correct configuration is applied. See notes below for specific +samples. +==== + +<> sample for Windows environment + +<> sample using server side authenticator + +<> sample using ticket validation +with spnego and form + +<> sample using ticket +validation with spnego and form (xml config) + +[[samples-sec-server-win-auth]] +== Security Server Windows Auth Sample +Goals of this sample: + +- In windows environment, User will be able to logon to application + with Windows Active directory Credential which has been entered + during log on to windows. There should not be any ask for + userid/password credentials. +- In non-windows environment, User will be presented with a screen + to provide Active directory credentials. + +[source,yaml,indent=0] +---- +server: + port: 8080 + app: + ad-domain: EXAMPLE.ORG + ad-server: ldap://WIN-EKBO0EQ7TS7.example.org/ + service-principal: HTTP/neo.example.org@EXAMPLE.ORG + keytab-location: /tmp/tomcat.keytab +---- +In above you can see the default configuration for this sample. You +can override these settings using a normal Spring Boot tricks like +using command-line options or custom `application.yml` file. + +Run a server. +[source,text,subs="attributes"] +---- +$ java -jar sec-server-win-auth-{revnumber}.jar +---- + +[NOTE] +==== +See <> for more instructions how to work with +windows kerberos environment. +==== + +Login to `Windows 8.1` using domain credentials and access sample + +image:images/ie1.png[] +image:images/ie2.png[] + +Access sample application from a non windows vm and use domain +credentials manually. + +image:images/ff1.png[] +image:images/ff2.png[] +image:images/ff3.png[] + + +[[samples-sec-server-client-auth]] +== Security Server Side Auth Sample +This sample demonstrates how server is able to authenticate user +against kerberos environment using his credentials passed in via a +form login. + +Run a server. +[source,text,subs="attributes"] +---- +$ java -jar sec-server-client-auth-{revnumber}.jar +---- + +[source,yaml,indent=0] +---- +server: + port: 8080 +---- + +[[samples-sec-server-spnego-form-auth]] +== Security Server Spnego and Form Auth Sample +This sample demonstrates how a server can be configured to accept a +Spnego based negotiation from a browser while still being able to fall +back to a form based authentication. + +Using a `user1` principal <>, do a kerberos login +either using credentials. +[source,text] +---- +$ kinit user1 +Password for user1@EXAMPLE.ORG: + +$ klist +Ticket cache: FILE:/tmp/krb5cc_1000 +Default principal: user1@EXAMPLE.ORG + +Valid starting Expires Service principal +10/03/15 17:18:45 11/03/15 03:18:45 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG + renew until 11/03/15 17:18:40 +---- + +or using a keytab file. + +[source,text] +---- +$ kinit -kt user1.keytab user1 + +$ klist +Ticket cache: FILE:/tmp/krb5cc_1000 +Default principal: user1@EXAMPLE.ORG + +Valid starting Expires Service principal +10/03/15 17:25:03 11/03/15 03:25:03 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG + renew until 11/03/15 17:25:03 +---- + +Run a server. +[source,text,subs="attributes"] +---- +$ java -jar sec-server-spnego-form-auth-{revnumber}.jar +---- + +Now you should be able to open your browser and let it do Spnego +authentication with existing ticket. + +[NOTE] +==== +See <> for more instructions for configuring +browsers to use Spnego. +==== + +[source,yaml,indent=0] +---- +server: + port: 8080 +app: + service-principal: HTTP/neo.example.org@EXAMPLE.ORG + keytab-location: /tmp/tomcat.keytab +---- + +[[samples-sec-server-spnego-form-auth-xml]] +== Security Server Spnego and Form Auth Xml Sample +This is a same sample than <> but +using xml based configuration instead of JavaConfig. + +Run a server. +[source,text,subs="attributes"] +---- +$ java -jar sec-server-spnego-form-auth-xml-{revnumber}.jar +---- + diff --git a/docs/src/reference/asciidoc/samples/AuthProviderConfig.xml b/docs/src/reference/asciidoc/samples/AuthProviderConfig.xml index c69f6f0..82d79f2 100644 --- a/docs/src/reference/asciidoc/samples/AuthProviderConfig.xml +++ b/docs/src/reference/asciidoc/samples/AuthProviderConfig.xml @@ -9,9 +9,10 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> - - - + + + + diff --git a/docs/src/reference/asciidoc/samples/SpnegoConfig.xml b/docs/src/reference/asciidoc/samples/SpnegoConfig.xml index 603caf1..b5a7546 100644 --- a/docs/src/reference/asciidoc/samples/SpnegoConfig.xml +++ b/docs/src/reference/asciidoc/samples/SpnegoConfig.xml @@ -4,60 +4,60 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security" xmlns:context="http://www.springframework.org/schema/context" - xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd - http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> - - - - + + + + + + + + - + + + + - - - + + + + + + + + - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + class="org.springframework.security.extensions.kerberos.docs.DummyUserDetailsService" /> diff --git a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.java b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.java index f3950f2..9e9767d 100644 --- a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.java +++ b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.java @@ -1,3 +1,18 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.security.extensions.kerberos.docs; import org.springframework.context.annotation.Bean; @@ -6,11 +21,6 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider; import org.springframework.security.extensions.kerberos.SunJaasKerberosClient; @@ -19,49 +29,41 @@ import org.springframework.security.extensions.kerberos.SunJaasKerberosClient; @EnableWebMvcSecurity public class AuthProviderConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/", "/home").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login").permitAll() - .and() - .logout() - .permitAll(); - } + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/", "/home").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login").permitAll() + .and() + .logout() + .permitAll(); + } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .authenticationProvider(kerberosAuthenticationProvider()); - } + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .authenticationProvider(kerberosAuthenticationProvider()); + } - @Bean - public KerberosAuthenticationProvider kerberosAuthenticationProvider() { - KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider(); - SunJaasKerberosClient client = new SunJaasKerberosClient(); - client.setDebug(true); - provider.setKerberosClient(client); - provider.setUserDetailsService(dummyUserDetailsService()); - return provider; - } + @Bean + public KerberosAuthenticationProvider kerberosAuthenticationProvider() { + KerberosAuthenticationProvider provider = + new KerberosAuthenticationProvider(); + SunJaasKerberosClient client = new SunJaasKerberosClient(); + client.setDebug(true); + provider.setKerberosClient(client); + provider.setUserDetailsService(dummyUserDetailsService()); + return provider; + } - @Bean - public DummyUserDetailsService dummyUserDetailsService() { - return new DummyUserDetailsService(); - } - - static class DummyUserDetailsService implements UserDetailsService { - - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return new User(username, "notUsed", true, true, true, true, - AuthorityUtils.createAuthorityList("ROLE_USER")); - } - - } + @Bean + public DummyUserDetailsService dummyUserDetailsService() { + return new DummyUserDetailsService(); + } } //end::snippetA[] diff --git a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.xml b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.xml index c69f6f0..82d79f2 100644 --- a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.xml +++ b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/AuthProviderConfig.xml @@ -9,9 +9,10 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> - - - + + + + diff --git a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/DummyUserDetailsService.java b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/DummyUserDetailsService.java new file mode 100644 index 0000000..66bbae0 --- /dev/null +++ b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/DummyUserDetailsService.java @@ -0,0 +1,35 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.security.extensions.kerberos.docs; + +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +//tag::snippetA[] +public class DummyUserDetailsService implements UserDetailsService { + + @Override + public UserDetails loadUserByUsername(String username) + throws UsernameNotFoundException { + return new User(username, "notUsed", true, true, true, true, + AuthorityUtils.createAuthorityList("ROLE_USER")); + } + +} +//end::snippetA[] diff --git a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.java b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.java index 93fd4b8..816546a 100644 --- a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.java +++ b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.java @@ -1,6 +1,20 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.security.extensions.kerberos.docs; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.FileSystemResource; @@ -9,11 +23,6 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider; import org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider; import org.springframework.security.extensions.kerberos.SunJaasKerberosClient; @@ -27,93 +36,83 @@ import org.springframework.security.web.authentication.www.BasicAuthenticationFi @EnableWebMvcSecurity public class SpnegoConfig extends WebSecurityConfigurerAdapter { - @Value("${app.service-principal}") - private String servicePrincipal; + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .exceptionHandling() + .authenticationEntryPoint(spnegoEntryPoint()) + .and() + .authorizeRequests() + .antMatchers("/", "/home").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login").permitAll() + .and() + .logout() + .permitAll() + .and() + .addFilterBefore( + spnegoAuthenticationProcessingFilter(authenticationManagerBean()), + BasicAuthenticationFilter.class); + } - @Value("${app.keytab-location}") - private String keytabLocation; + @Override + protected void configure(AuthenticationManagerBuilder auth) + throws Exception { + auth + .authenticationProvider(kerberosAuthenticationProvider()) + .authenticationProvider(kerberosServiceAuthenticationProvider()); + } - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .exceptionHandling() - .authenticationEntryPoint(spnegoEntryPoint()) - .and() - .authorizeRequests() - .antMatchers("/", "/home").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login").permitAll() - .and() - .logout() - .permitAll() - .and() - .addFilterBefore( - spnegoAuthenticationProcessingFilter(authenticationManagerBean()), - BasicAuthenticationFilter.class); - } + @Bean + public KerberosAuthenticationProvider kerberosAuthenticationProvider() { + KerberosAuthenticationProvider provider = + new KerberosAuthenticationProvider(); + SunJaasKerberosClient client = new SunJaasKerberosClient(); + client.setDebug(true); + provider.setKerberosClient(client); + provider.setUserDetailsService(dummyUserDetailsService()); + return provider; + } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .authenticationProvider(kerberosAuthenticationProvider()) - .authenticationProvider(kerberosServiceAuthenticationProvider()); - } + @Bean + public SpnegoEntryPoint spnegoEntryPoint() { + return new SpnegoEntryPoint("/login"); + } - @Bean - public KerberosAuthenticationProvider kerberosAuthenticationProvider() { - KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider(); - SunJaasKerberosClient client = new SunJaasKerberosClient(); - client.setDebug(true); - provider.setKerberosClient(client); - provider.setUserDetailsService(dummyUserDetailsService()); - return provider; - } + @Bean + public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter( + AuthenticationManager authenticationManager) { + SpnegoAuthenticationProcessingFilter filter = + new SpnegoAuthenticationProcessingFilter(); + filter.setAuthenticationManager(authenticationManager); + return filter; + } - @Bean - public SpnegoEntryPoint spnegoEntryPoint() { - return new SpnegoEntryPoint("/login"); - } + @Bean + public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() { + KerberosServiceAuthenticationProvider provider = + new KerberosServiceAuthenticationProvider(); + provider.setTicketValidator(sunJaasKerberosTicketValidator()); + provider.setUserDetailsService(dummyUserDetailsService()); + return provider; + } - @Bean - public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter( - AuthenticationManager authenticationManager) { - SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter(); - filter.setAuthenticationManager(authenticationManager); - return filter; - } + @Bean + public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() { + SunJaasKerberosTicketValidator ticketValidator = + new SunJaasKerberosTicketValidator(); + ticketValidator.setServicePrincipal("HTTP/servicehost.example.org@EXAMPLE.ORG"); + ticketValidator.setKeyTabLocation(new FileSystemResource("/tmp/service.keytab")); + ticketValidator.setDebug(true); + return ticketValidator; + } - @Bean - public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() { - KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider(); - provider.setTicketValidator(sunJaasKerberosTicketValidator()); - provider.setUserDetailsService(dummyUserDetailsService()); - return provider; - } - - @Bean - public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() { - SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator(); - ticketValidator.setServicePrincipal(servicePrincipal); - ticketValidator.setKeyTabLocation(new FileSystemResource(keytabLocation)); - ticketValidator.setDebug(true); - return ticketValidator; - } - - @Bean - public DummyUserDetailsService dummyUserDetailsService() { - return new DummyUserDetailsService(); - } - - static class DummyUserDetailsService implements UserDetailsService { - - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return new User(username, "notUsed", true, true, true, true, - AuthorityUtils.createAuthorityList("ROLE_USER")); - } - - } + @Bean + public DummyUserDetailsService dummyUserDetailsService() { + return new DummyUserDetailsService(); + } } //end::snippetA[] diff --git a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.xml b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.xml index 603caf1..b5a7546 100644 --- a/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.xml +++ b/spring-security-kerberos-core/src/test/java/org/springframework/security/extensions/kerberos/docs/SpnegoConfig.xml @@ -4,60 +4,60 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security" xmlns:context="http://www.springframework.org/schema/context" - xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd - http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> - - - - + + + + + + + + - + + + + - - - + + + + + + + + - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + class="org.springframework.security.extensions.kerberos.docs.DummyUserDetailsService" /> diff --git a/spring-security-kerberos-samples/build.gradle b/spring-security-kerberos-samples/build.gradle index b3c301e..1a1151a 100644 --- a/spring-security-kerberos-samples/build.gradle +++ b/spring-security-kerberos-samples/build.gradle @@ -12,7 +12,7 @@ project('sec-server-spnego-form-auth') { description = 'Security Server Spnego and Form Auth Sample' } -project('sec-server-spnego-form-auth') { +project('sec-server-spnego-form-auth-xml') { description = 'Security Server Spnego and Form Auth Xml Sample' }