I didn't look at your code...but I guess you need to redirect to a not
protected page when users try to access your app. If the home page is
protected then redirecting to it will trigger another redirect....



On Fri, Apr 4, 2025 at 3:37 AM Chris Whitcomb <chrswhitc...@gmail.com>
wrote:

> I have a wicket 8 application that is using Spring security (Spring Boot
> 2.1.10) and is deployed on WebSphere traditional 8.5.5.x.  WAS is connected
> to an LDAP.  This application uses the J2EE (WAS) security.  The server
> does have Kerberos configured.
>
> I know WAS 8.5.5 does not officially support Spring boot 2.1.10 and Wicket
> 8.  However, I have deployed this to a local WAS without the Kerberos
> configured and it works.  This local WAS prompts for login.  I do
> understand this could be a version problem.
>
>
>
> We would like the application to use the current Windows user to
> automatically log in (no login prompt to the user).
>
>
>
> When hitting the URL in the logs we see the application loops a number of
> times and each time it loops, it creates a session.  I’m not sure where or
> why the session is being created.  Eventually the browser shows the error
> ‘too many redirects’.  I have seen 20 – 30 sessions created before it
> stops.  I have set the Spring SessionCreationPolicy to each option and the
> behavior did not change.
>
>
>
> I want to secure the homepage – only users in a specific group should be
> able to access the home page.  If they are not in the group, they should
> get redirected to an access denied page.  Since we are having problems, I
> have modified the code to show the page if the user is authenticated.  Once
> we get that working, we will add in the group membership.
>
>
>
> I have tried setting the role in the WebSession and then using
> @AuthorizeInstantiotion(“role”).
>
> I have also tried returning the page to display in the WebApplication class
> depending on if the user is signed in or not.
>
> Both just loop until it gives up.
>
> I do see all the output from the home page (SearchPage class) init, but
> then it loops and starts over.
>
>
>
> Code below:
>
>
>
> I do have a web.xml with a security constraint as it seems WebSphere needs
> this otherwise we don’t get a principal at all.
>
> <security-constraint>
>
>         <web-resource-collection>
>
>             <web-resource-name>User</web-resource-name>
>
>             <url-pattern>/*</url-pattern>
>
>         </web-resource-collection>
>
>         <auth-constraint>
>
>             <role-name>AllAuthenticated</role-name>
>
>         </auth-constraint>
>
>     </security-constraint>
>
>     *<!-- Security roles used in the application -->*
>
>     <security-role>
>
>         <role-name>AllAuthenticated</role-name>
>
>     </security-role>
>
>
>
> My WebSession class:
>
> public class *AppWebSession* extends AbstractAuthenticatedWebSession {
>
>
>
>     public volatile boolean signedIn;
>
>
>
>     public *AppWebSession*(Request request) {
>
>         super(request);
>
>         *init*();
>
>     }
>
>
>
>     private void *init*() {
>
>         Injector.*get*().*inject*(this);
>
>         log.*debug*("Session Injected.");
>
>     }
>
>
>
>     public static AppWebSession *get*(){
>
>         return (AppWebSession) Session.*get*();
>
>     }
>
>
>
>     @Override
>
>     public Roles *getRoles*() {
>
>         log.*debug*("getRoles()");
>
>
>
>         Roles roles = new *Roles*();
>
>
>
>         if(AppWebSession.*get*().*isSignedIn*()){
>
>             // Because we are having problems, just set the role if
> isSignedIn = true.  Later, we will set the roles based on group membership.
>
>             roles.add(“HASACCESS”);
>
>
>
>         return roles;
>
>     }
>
>
>
>     @Override
>
>     public boolean *isSignedIn*() {
>
>
>
>        signedIn = SecurityContextHolder.*getContext*().*getAuthentication*
> ().*isAuthenticated*();
>
>         log.*debug*("signedIn -> " + signedIn);   <--  This shows ‘true’.
>
>        return signedIn;
>
>     }
>
> }
>
>
>
>
>
> My SecurityConfig class:
>
> @Configuration
>
> @EnableWebSecurity (debug = true)
>
> public class *AppSecurityConfig* extends *WebSecurityConfigurerAdapter* {
>
>
>
>     private WebSpherePreAuthenticatedProcessingFilter wasPreAuthFilter =
> new *WebSpherePreAuthenticatedProcessingFilter*();
>
>
>
>     @Override
>
>     protected void *configure*(HttpSecurity http) throws Exception {
>
>
>
>         wasPreAuthFilter.*setAuthenticationManager*(*authenticationManager*
> ());
>
>         http
>
>         .*addFilter*(wasPreAuthFilter)
>
>         .*authorizeRequests*()
>
>         .*anyRequest*().*permitAll*();
>
>     }
>
>
>
>     @Override
>
>     protected void *configure*(AuthenticationManagerBuilder auth) throws
> Exception {
>
>         auth.*authenticationProvider*(*websphereAuthenticationProvider*());
>
>     }
>
>
>
>
>
>     *// Required  for WASPreAuth Filter*
>
>     @Bean
>
>     public AuthenticationProvider *websphereAuthenticationProvider*() {
>
>
>
>         return new *AuthenticationProvider*() {
>
>
>
>             @Override
>
>             public Authentication *authenticate*(Authentication
> authentication) throws AuthenticationException {
>
>
>
>                 String groupName = "AD Group name";
>
>                 PreAuthenticatedAuthenticationToken preAuthToken = new
> *PreAuthenticatedAuthenticationToken*(authentication.*getPrincipal*(),
> authentication.*getCredentials*());
>
>
>
>                 try {
>
>
>
>                     Subject subject = WSSubject.*getCallerSubject*();
>
>                     Optional<Principal> principal = subject.*getPrincipals*
> ().*stream*().*findFirst*();
>
>                     if (principal.*isPresent*()) {
>
>                         log.*debug*("principal = " + principal.*get*().
> *getName*());
>
>                     }
>
>                     Optional<WSCredential> credentialStream = subject.
> *getPublicCredentials*(WSCredential.class).*stream*().*findFirst*();
>
>
>
>                     List<GrantedAuthority> authorities = new ArrayList<>();
>
>
>
>                     Stream<String> groupIds = credentialStream.*get*().
> *getGroupIds*().*stream*();
>
>
>
>                     Optional<String> group = groupIds.*filter*(i -> i.
> *contains*(groupName.*trim*())).*findFirst*();
>
>                     if (group.*isPresent*()) {
>
>                         log.*debug*("group found: " + group.*get*());
>
>                         authorities.*add*(new *SimpleGrantedAuthority*
> ("ROLE_HASACCESS"));
>
>                     } else {
>
>                         log.*debug*("Group not found");
>
>                     }
>
>                     preAuthToken = new
> *PreAuthenticatedAuthenticationToken*
> (principal.*get*(), credentialStream.*get*(), authorities);
>
>
>
>                 }
>
>                 catch (WSSecurityException e) {
>
>                     log.*error*(e.*getMessage*(), e);
>
>                 } catch (CredentialExpiredException e) {
>
>                     log.*error*(e.*getMessage*(), e);
>
>                 }
>
>
>
>                 return preAuthToken;
>
>             }
>
>
>
>             @Override
>
>             public boolean *supports*(Class<?> authentication) {
>
>
>
>                 return true;
>
>             }
>
>         };
>
>     }
>
> }
>
>
>
> My HomePage class:
>
> *// @AuthorizeInstantiation("hasAccess")  Commented out and using the
> getHomePage logic*
>
> public class *SearchPage* extends *BasePage* {
>
>
>
>     private IModel<AppSearchCriteria> searchCriteriaIModel = new
> Model<>(new *AppSearchCriteria*());
>
>     private boolean showSearchResults = false;
>
>
>
>
>
>     public *SearchPage*() {
>
>         super();
>
>         log.*debug*("SearchPage()");
>
>     }
>
>
>
>     public *SearchPage*(IModel<AppSearchCriteria> model) {
>
>         super();
>
>         log.*debug*("SearchPage(model)");
>
>         searchCriteriaIModel = model;
>
>     }
>
>
>
>     @Override
>
>     protected void *onInitialize*() {
>
>         super.*onInitialize*();
>
>         log.*debug*("SearchPage.init()");
>
>         Form<AppSearchCriteria> form = new Form<>("form",
> searchCriteriaIModel);
>
>         log.*debug*("form created");
>
>         form.*type*(FormType.Horizontal);
>
>         *add*(form);
>
>         log.*debug*("form added");
>
>         log.*debug*("SearchPage.init() done");
>
>     }
>
> }
>
>
>
> From the WebApplication class:
>
> @Override
>
>     public Class<? extends Page> *getHomePage*() {
>
>         log.*debug*("getHomePage()");
>
>         AppWebSession session = (AppWebSession)AppWebSession.*get*();
>
>         log.*debug*("Determine which page to show ...");
>
>         // This principal that is output is correct.
>
>         log.*debug*("SecurityContextHolder principal: " +
> SecurityContextHolder.*getContext*().*getAuthentication*().*getPrincipal*
> ());
>
>
>
>         if (session != null) {
>
>             if (session.*isSignedIn*()) {
>
>                 log.*debug*("signed in - returning
> SearchPage");               <-- I do see this output in the logs
>
>                 return SearchPage.class;
>
>             } else {
>
>                 log.*debug*("session not signed in - returning
> NotAuthorized");
>
>                 return NotAuthorized.class;
>
>             }
>
>         } else {
>
>             log.*debug*("session is NULL - returning NotAuthorized");
>
>             return NotAuthorized.class;
>
>         }
>
>     }
>


-- 
Regards - Ernesto Reinaldo Barreiro

Reply via email to