Hi all,

I know this has been posted before 
(https://groups.google.com/a/apereo.org/forum/?utm_medium=email&utm_source=footer#!msg/cas-user/hmtHSpsYhLE/dXhzQSNJAAAJ),
 
but I am still having a hard time upgrading our CAS 4.x to 5.x.  I have not 
worked much in the Spring Framework and Spring Boot, so I'm still fresh to 
much of the inner workings of it.

A previous developer had set up CAS 4.x with a custom authentication 
handler for our application environment.  Please see the code for the 
handler and deployerConfigContext.xml:

*deployerConfigContext.xml:*
    <util:map id="authenticationHandlersResolvers">
        <entry key-ref="proxyAuthenticationHandler" value-ref=
"proxyPrincipalResolver" />
        <entry key-ref="primaryAuthenticationHandler" value-ref=
"primaryPrincipalResolver" />
    </util:map>
 
 


    <util:list id="authenticationMetadataPopulators">
        <ref bean="successfulHandlerMetaDataPopulator" />
        <ref bean="rememberMeAuthenticationMetaDataPopulator" />
    </util:list>


    <bean id="attributeRepository" class=
"org.jasig.services.persondir.support.NamedStubPersonAttributeDao"
          p:backingMap-ref="attrRepoBackingMap" />


    <alias name="acceptUsersAuthenticationHandler" alias=
"primaryAuthenticationHandler" />
    <alias name="personDirectoryPrincipalResolver" alias=
"primaryPrincipalResolver" />


    <util:map id="attrRepoBackingMap">
        <entry key="uid" value="uid" />
        <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
        <entry key="groupMembership" value="groupMembership" />
        <entry>
            <key><value>memberOf</value></key>
            <list>
                <value>faculty</value>
                <value>staff</value>
                <value>org</value>
            </list>
        </entry>
    </util:map>


    <alias name="serviceThemeResolver" alias="themeResolver" />


    <alias name="jsonServiceRegistryDao" alias="serviceRegistryDao" />


    <alias name="ehcacheTicketRegistry" alias="ticketRegistry" />


    <alias name="ticketGrantingTicketExpirationPolicy" alias=
"grantingTicketExpirationPolicy" />
    <alias name="multiTimeUseOrTimeoutExpirationPolicy" alias=
"serviceTicketExpirationPolicy" />


    <alias name="anyAuthenticationPolicy" alias="authenticationPolicy" />
    <alias name="acceptAnyAuthenticationPolicyFactory" alias=
"authenticationPolicyFactory" />


    <bean id="auditTrailManager"
          class=
"org.jasig.inspektr.audit.support.Slf4jLoggingAuditTrailManager"
          p:entrySeparator="${cas.audit.singleline.separator:|}"
          p:useSingleLine="${cas.audit.singleline:false}"/>


    <alias name="neverThrottle" alias="authenticationThrottle" />


    <util:list id="monitorsList">
        <ref bean="memoryMonitor" />
        <ref bean="sessionMonitor" />
    </util:list>
 


    <alias name="defaultPrincipalFactory" alias="principalFactory" />
    <alias name="defaultAuthenticationTransactionManager" alias=
"authenticationTransactionManager" />
    <alias name="defaultPrincipalElectionStrategy" alias=
"principalElectionStrategy" />
    <alias name="tgcCipherExecutor" alias="defaultCookieCipherExecutor" />
 


 
 <bean id="(customPasswordEncoder)" class="(classForPasswordEncoder)"/>
 
 <bean id="DatabaseAuthenticationHandler" class=
"(classForCustomDatabaseHandler)">
 <property name="principalFactory" ref="defaultPrincipalFactory"/>
 <property name="passwordEncoder" ref="customPasswordEncoder"/> 
 <property name="dataSource">
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
 <property name="driverClassName" value=
"com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
 <property name="url" value="(ourSqlInstance*)*;"/>
 </bean> 
 </property>
 
 
 <alias name="dataSource" alias="queryEncodeDatabaseDataSource" />


 <alias name="DatabaseAuthenticationHandler" alias=
"primaryAuthenticationHandler" /> 


*CustomDatabaseHandler:*
package example.apps.cas.authentication;


import java.security.GeneralSecurityException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import javax.security.auth.login.AccountNotFoundException;
import javax.security.auth.login.FailedLoginException;
import org.apache.commons.lang3.StringUtils;
import org.jasig.cas.authentication.BasicCredentialMetaData;
import org.jasig.cas.authentication.Credential;
import org.jasig.cas.authentication.DefaultHandlerResult;
import org.jasig.cas.authentication.HandlerResult;
import org.jasig.cas.authentication.MessageDescriptor;
import org.jasig.cas.authentication.PreventedException;
import org.jasig.cas.authentication.UsernamePasswordCredential;
import 
org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.principal.DefaultPrincipalFactory;
import org.jasig.cas.authentication.principal.Principal;
import org.apache.commons.dbcp.BasicDataSource;


import example.apps.cas.dao.UserDao;
import example.apps.cas.model.UserModel;


public class DatabaseAuthenticationHandler extends 
AbstractUsernamePasswordAuthenticationHandler {


 private DefaultPrincipalFactory principalFactory = null;
 private BasicDataSource dataSource = null;


 @Override
 public boolean supports(Credential credentials) {
 return credentials != null && UsernamePasswordCredential.class.
isAssignableFrom(credentials.getClass());
 }


 @Override
 protected HandlerResult authenticateUsernamePasswordInternal(
UsernamePasswordCredential credentials)
 throws GeneralSecurityException, PreventedException {


 String username = credentials.getUsername().trim();
 String password = credentials.getPassword();


 UserDao userDao = new UserDao();
 BasicDataSource dataSource = this.getDataSource();
 userDao.setDataSource(dataSource);


 // Throw exception if username is blank
 if (StringUtils.isEmpty(username)) {
 throw new AccountNotFoundException("Username can not be blank.");
 }


 // Throw exception if password is blank
 if (StringUtils.isEmpty(password)) {
 throw new FailedLoginException(String.format("Password can not be blank 
for user %s.", username));
 }


 // Throw exception if unable to select password from database
 UserModel user = new UserModel();
 try {
 user = userDao.getUser(username);
 } catch (SQLException e) {
 e.printStackTrace();
 throw new PreventedException(String.format("Unable to retrieve password 
from database for user %s."), e);
 }


 // Throw exception if user account does not exist in database
 if (user == null) {
 throw new AccountNotFoundException(String.format("Unable to find account 
for user %s.", username));
 }


 // Throw exception if password cannot be encrypted
 String encryptedPassword = this.getPasswordEncoder().encode(password);
 if (encryptedPassword == null) {
 throw new PreventedException(String.format("Unable to encrypt user 
password for user %s.", username),
 new NullPointerException("Encoded password is null."));
 }


 // Throw exception if password do not match
 if (!encryptedPassword.equals(user.getEncryptedPassword())) {
 throw new FailedLoginException(String.format("Failed to authenticate 
password for user %s", username));
 }


 UsernamePasswordCredential handlerCredentials = new 
UsernamePasswordCredential();
 handlerCredentials.setUsername(username);
 handlerCredentials.setUsername(password);

 


 return this.createHandlerResult(handlerCredentials, this.
getPrincipalFactory().createPrincipal(username), null);
 }
 
 
 @Override
 public String getName() {
 return "DatabaseAuthenticationHandler";
 }
 


 public DefaultPrincipalFactory getPrincipalFactory() {
 return principalFactory;
 }


 public void setPrincipalFactory(DefaultPrincipalFactory principalFactory) {
 this.principalFactory = principalFactory;
 }


 public BasicDataSource getDataSource() {
 return dataSource;
 }


 public void setDataSource(BasicDataSource dataSource) {
 this.dataSource = dataSource;
 }


Now, I understand the best thing to do is to move this to some sort of 
Configuration file for Spring Boot.  I've also 
read https://apereo.github.io/2017/02/02/cas51-authn-handlers/.  I guess my 
questions are as follows:

1) Is there some documentation for individuals who are newer to Spring 
Framework, to help them create this configuration files?
2) I read that you can still use the deployerConfigContext.xml if need be.  
Is there some documentation on handling how you can get this to work with 
5.x?

Apologies if there is any repeated questions, and thanks for your help!

Nick

-- 
- Website: https://apereo.github.io/cas
- Gitter Chatroom: https://gitter.im/apereo/cas
- List Guidelines: https://goo.gl/1VRrw7
- Contributions: https://goo.gl/mh7qDG
--- 
You received this message because you are subscribed to the Google Groups "CAS 
Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/a/apereo.org/d/msgid/cas-user/d1dbfdb5-0821-44cf-a9b8-cef984b4695e%40apereo.org.

Reply via email to