I create a separate jar which I make part of cas overlay through maven
dependency, which in turn is detected through
src/webapp/META-INF/spring.factories put in overlay with content:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=my.domain.apps.cas.MyAuthenticationEventExecutionPlanConfiguration

Following is the pom for that jar:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0";
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd ">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my.domain.libs</groupId>
    <artifactId>cas-server-my-support-jdbc</artifactId>
    <name>support-jdbc</name>
    <packaging>jar</packaging>

    <properties>
        <cas.version>5.1.0</cas.version>
        <springboot.version>1.5.3.RELEASE</springboot.version>
         <!-- app.server could be -jetty, -undertow, -tomcat, or blank if
you plan to provide appserver -->
        <app.server></app.server>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>



    <dependencies>
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-core-authentication</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-core-configuration</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-core-webflow</artifactId>
            <version>${cas.version}</version>

        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.rimerosolutions.maven.plugins</groupId>
                <artifactId>wrapper-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <verifyDownload>true</verifyDownload>
                    <checksumAlgorithm>MD5</checksumAlgorithm>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${springboot.version}</version>
                <configuration>

<mainClass>org.springframework.boot.loader.WarLauncher</mainClass>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>cas</warName>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <recompressZippedFiles>false</recompressZippedFiles>
                    <archive>
                        <compress>false</compress>

<manifestFile>${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp/META-INF/MANIFEST.MF
                        </manifestFile>
                    </archive>
                    <overlays>
                        <overlay>
                            <groupId>org.apereo.cas</groupId>
                            <artifactId>cas-server-webapp</artifactId>
                        </overlay>
                    </overlays>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                </plugin>
        </plugins>
        <finalName>cas-server-support-jdbc-conicet</finalName>
    </build>

    <repositories>
        <repository>
            <id>sonatype-releases</id>
            <url>http://oss.sonatype.org/content/repositories/releases/
</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>sonatype-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/
</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
        <repository>
            <id>shibboleth-releases</id>
            <url>
https://build.shibboleth.net/nexus/content/repositories/releases</url>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <profiles>
        <profile>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <id>pgp</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>com.github.s4u.plugins</groupId>
                        <artifactId>pgpverify-maven-plugin</artifactId>
                        <version>1.1.0</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <pgpKeyServer>hkp://pool.sks-keyservers.net
</pgpKeyServer>

<pgpKeysCachePath>${settings.localRepository}/pgpkeys-cache</pgpKeysCachePath>
                            <scope>test</scope>
                            <verifyPomFiles>true</verifyPomFiles>
                            <failNoSignature>false</failNoSignature>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>


2017-12-11 11:51 GMT-03:00 noumann.f <nouman...@gmail.com>:

> Thanks again for your patience,
>
> My real problem is that the custom code I put in the *src/main/java* is
> being compiled but not executed!
>
> In other word the server didn't reach the customization code I'm making
> even when I add these to the properties file:
>
> cas.authn.policy.requiredHandlerAuthenticationPolicyEnabled=true
> cas.authn.policy.req.tryAll=false
> cas.authn.policy.req.handlerName=FileAuthenticationHandler
> cas.authn.policy.req.enabled=true
>
> I gave up the JDBC handler for now, and trying to make a simpler one like
> customizing the *FileAuthenticationHandler*, just copying the structure
> and the code into custom ones and trying to operate it.
>
> And still facing the same problem, it isn't running my custom registration
> and handler, it runs the generic file ones!!!
>
> Authentication Handler:
> package org.custom;
>
> // imports are copied from the original files
>
> public class CustomFileAuthenticationHandler extends
> AbstractUsernamePasswordAuthenticationHandler {
>     /** The default separator in the file. */
>     public static final String DEFAULT_SEPARATOR = "::";
>
>     /** The separator to use. */
>     private final String separator;
>
>     /** The filename to read the list of usernames from. */
>     private final Resource fileName;
>
>     public CustomFileAuthenticationHandler(final String name, final
> ServicesManager servicesManager, final PrincipalFactory principalFactory,
>                                      final Resource fileName, final String
> separator) {
>         super(name, servicesManager, principalFactory, null);
>         this.fileName = fileName;
>         this.separator = separator;
>     }
>
>     @Override
>     protected HandlerResult authenticateUsernamePasswordInternal(final
> UsernamePasswordCredential transformedCredential,
>                                                                  final
> String originalPassword)
>             throws GeneralSecurityException, PreventedException {
>         try {
>             if (this.fileName == null) {
>                 throw new FileNotFoundException("Filename does not exist"
> );
>             }
>             final String username = transformedCredential.getUsername();
>             final String passwordOnRecord = getPasswordOnRecord(username);
>             if (StringUtils.isBlank(passwordOnRecord)) {
>                 throw new AccountNotFoundException(username + " not found
> in backing file.");
>             }
>             if (matches(originalPassword, passwordOnRecord)) {
>                 return createHandlerResult(transformedCredential, this.
> principalFactory.createPrincipal(username), null);
>             }
>         } catch (final IOException e) {
>             throw new PreventedException("IO error reading backing file",
> e);
>         }
>         throw new FailedLoginException();
>     }
>
>     /**
>      * Gets the password on record.
>      *
>      * @param username the username
>      * @return the password on record
>      * @throws IOException Signals that an I/O exception has occurred.
>      */
>     private String getPasswordOnRecord(final String username) throws
> IOException {
>         return Files.lines(fileName.getFile().toPath())
>                 .map(line -> line.split(this.separator))
>                 .filter(lineFields -> {
>                     final String userOnRecord = lineFields[0];
>                     return username.equals(userOnRecord);
>                 })
>                 .map(lineFields -> lineFields[1])
>                 .findFirst()
>                 .orElse(null);
>     }
> }
>
>
> Registration class:
>
>
> package org.custom;
>
> // imports are copied from the original
>
> @Configuration("customFileAuthenticationEventExecutionPlanConfiguration")
> @EnableConfigurationProperties(CasConfigurationProperties.class)
> public class CustomFileAuthenticationEventExecutionPlanConfiguration
> implements AuthenticationEventExecutionPlanConfigurer {
>     private static final Logger LOGGER = LoggerFactory.getLogger(Custom
> FileAuthenticationEventExecutionPlanConfiguration.class);
>
>     @Autowired(required = false)
>     @Qualifier("customFilePasswordPolicyConfiguration")
>     private PasswordPolicyConfiguration customFilePasswordPolicyConfig
> uration;
>
>     @Autowired
>     @Qualifier("servicesManager")
>     private ServicesManager servicesManager;
>
>     @Autowired
>     private CasConfigurationProperties casProperties;
>
>     @Autowired
>     @Qualifier("personDirectoryPrincipalResolver")
>     private PrincipalResolver personDirectoryPrincipalResolver;
>
>     @ConditionalOnMissingBean(name = "filePrincipalFactory")
>     @Bean
>     public PrincipalFactory filePrincipalFactory() {
>         return new DefaultPrincipalFactory();
>     }
>
>     @RefreshScope
>     @Bean
>     public AuthenticationHandler customFileAuthenticationHandler() {
>         final FileAuthenticationProperties fileProperties = casProperties.
> getAuthn().getFile();
>         final FileAuthenticationHandler h = new FileAuthenticationHandler(
> fileProperties.getName(), servicesManager, filePrincipalFactory(),
>                 fileProperties.getFilename(), fileProperties.getSeparator
> ());
>
>
>         h.setPasswordEncoder(Beans.newPasswordEncoder(fileProperties.
> getPasswordEncoder()));
>         if (customFilePasswordPolicyConfiguration != null) {
>             h.setPasswordPolicyConfiguration(customFilePasswordPolicyCon
> figuration);
>         }
>         h.setPrincipalNameTransformer(Beans.newPrincipalNameTransformer(
> fileProperties.getPrincipalTransformation()));
>
>         return h;
>     }
>
>     @Override
>     public void configureAuthenticationExecutionPlan(final
> AuthenticationEventExecutionPlan plan) {
>         if (casProperties.getAuthn().getFile().getFilename() != null) {
>             LOGGER.debug("zzz Added file-based authentication handler");
>             plan.registerAuthenticationHandlerWithPrincipalResolver(cust
> omFileAuthenticationHandler(), personDirectoryPrincipalResolver);
>         }
>     }
> }
>
>
> CAS Properties:
> cas.authn.file.separator=::
> cas.authn.file.filename=file:///etc/cas/usersfile
> cas.authn.file.name=usersfile
>
> ....
>
> cas.authn.policy.requiredHandlerAuthenticationPolicyEnabled=true
> cas.authn.policy.req.tryAll=false
> cas.authn.policy.req.handlerName=CustomFileAuthenticationHandler
> cas.authn.policy.req.enabled=true
>
>
> On Wednesday, December 6, 2017 at 11:18:28 PM UTC+2, noumann.f wrote:
>>
>> Hi,
>>
>> I need to create a custom JDBC authentication handler, I'd done this
>> previously with version 4.x but with new version 5.1.x things have changed
>> !!
>>
>> I'm following the guide in here: https://apereo.github.io
>> /2017/02/02/cas51-authn-handlers
>> but I need more details about registering the new handler and how to
>> create special properties for it in the cas.properties and then reach them
>> in the code!
>>
>> Best regards,
>>
> --
> - 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 cas-user+unsubscr...@apereo.org.
> To view this discussion on the web visit https://groups.google.com/a/
> apereo.org/d/msgid/cas-user/d9bf60e4-910c-4518-987d-
> a3547bc18bb5%40apereo.org
> <https://groups.google.com/a/apereo.org/d/msgid/cas-user/d9bf60e4-910c-4518-987d-a3547bc18bb5%40apereo.org?utm_medium=email&utm_source=footer>
> .
>

-- 
- 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 cas-user+unsubscr...@apereo.org.
To view this discussion on the web visit 
https://groups.google.com/a/apereo.org/d/msgid/cas-user/CAMY5midTUH_x%3DsJwgw9B_19RM-4mnmV92Mo7eKObBAh2SiAogg%40mail.gmail.com.

Reply via email to