`
zjnbshifox
  • 浏览: 315714 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

CAS自定义Credentials登录

    博客分类:
  • Java
阅读更多
先看了这篇文章http://www.blogjava.net/junky/archive/2007/08/20/138136.html,但是这个的版本是3.1的,而最新的是3.5的,差别还是有一点的,网上找了很多资料,也看了一点CAS server的源代码,终于搞定,因为想用idea开发,结果环境不熟悉,蛋疼,虽然现在Eclipse越来越慢,也只好将就着用,废话不说,代码说话,首先定义自己的Credentials
public class NbrcCredentials implements Credentials {
    private static final long serialVersionUID = 2053021031579470710L;

    private String idtype;

    private String username;

    private String password;
    
    //getter and setter...

}

然后修改登录页面,在password后面增加一个选项,这里直接用中文会乱码,需要到资源文件里去定义,为了方便我直接这么写了
<spring:message code="screen.welcome.label.password.accesskey" var="passwordAccessKey" />
						<form:password cssClass="required" cssErrorClass="error" id="password" size="25" tabindex="2" path="password"  accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" />
                        <br/>
                        User TYPE<select name="idtype" id="idtype">
                            <option value="1">ADMIN</option>
                            <option value="2">OPER</option>
                        </select>

找到/WEB-INF/下的login-webflow.xml文件,需要修改两个地方,第一把原来的Credentials注释,然后定义自己的
 <!-- <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" /> -->
    <var  name="credentials" class="com.nbrc.sso.cas.principal.NbrcCredentials"/>

然后找到

	<view-state id="viewLoginForm" view="casLoginView" model="credentials">
        <binder>
            <binding property="username" />
            <binding property="password" />
            <binding property="idtype"/> <!--增加这一行 -->
        </binder>
        ...
       </view-state>


这样数据就能绑定了,还要自定义一个处理登录过程的类
package com.nbrc.cas.handler.support;

import com.nbrc.sso.cas.principal.NbrcCredentials;
import org.jasig.cas.authentication.handler.*;
import org.jasig.cas.authentication.principal.Credentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

public class NbrcAuthenticationHandler implements AuthenticationHandler {
    private static final Class<NbrcCredentials> DEFAULT_CLASS = NbrcCredentials.class;

    private PasswordEncoder passwordEncoder = new PlainTextPasswordEncoder();
    private JdbcTemplate jdbcTemplate;

    private DataSource dataSource;

    private PrincipalNameTransformer principalNameTransformer = new NoOpPrincipalNameTransformer();
    /** Class that this instance will support. */
    private Class<?> classToSupport = DEFAULT_CLASS;
    private boolean supportSubClasses = true;
    @Override
    public boolean authenticate(Credentials credentials) throws AuthenticationException {
        final NbrcCredentials nc = (NbrcCredentials) credentials;
        final String username = getPrincipalNameTransformer().transform(nc.getUsername());
        final String password = nc.getPassword();
        final String encryptedPassword = this.getPasswordEncoder().encode(
                password);

        if("1".equals(nc.getIdtype())){
            try {
            	final String sql = "select `password` from t_admin_user where login_name=?";
                final String dbPassword = getJdbcTemplate().queryForObject(
                        sql
                        , String.class, username);
                return dbPassword.equals(encryptedPassword);
            } catch (final IncorrectResultSizeDataAccessException e) {
                // this means the username was not found.
                return false;
            }
        }

        if("2".equals(nc.getIdtype())){
            try {
            	final String sql = "select `password` from t_oper_user where login_name=?";
                final String dbPassword = getJdbcTemplate().queryForObject(
                        sql
                        , String.class, username);
                return dbPassword.equals(encryptedPassword);
            } catch (final IncorrectResultSizeDataAccessException e) {
                // this means the username was not found.
                return false;
            }
        }
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public boolean supports(Credentials credentials) {
        return credentials != null
                && (this.classToSupport.equals(credentials.getClass()) || (this.classToSupport
                .isAssignableFrom(credentials.getClass()))
                && this.supportSubClasses);
    }

    public PasswordEncoder getPasswordEncoder() {
        return passwordEncoder;
    }

    public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    public PrincipalNameTransformer getPrincipalNameTransformer() {
        return principalNameTransformer;
    }

    public void setPrincipalNameTransformer(PrincipalNameTransformer principalNameTransformer) {
        this.principalNameTransformer = principalNameTransformer;
    }

    public final void setDataSource(final DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        this.dataSource = dataSource;
    }

    /**
     * Method to return the jdbcTemplate
     *
     * @return a fully created JdbcTemplate.
     */
    protected final JdbcTemplate getJdbcTemplate() {
        return this.jdbcTemplate;
    }

    protected final DataSource getDataSource() {
        return this.dataSource;
    }
}


最后把处理类注册到/WEB-INF/deployerConfigContext.xml文件中,替换原有的AuthenticationHandler
<!--<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
				    <property name="dataSource" ref="dataSource"></property>
				    <property name="sql" value="select password from t_admin_user where login_name=?"></property>
				    <property name="passwordEncoder" ref="MD5PasswordEncoder"></property>
				</bean>-->
                <bean  class="com.nbrc.cas.handler.support.NbrcAuthenticationHandler" >
                    <property name="dataSource" ref="dataSource"></property>
                </bean>
分享到:
评论
2 楼 zjnbshifox 2013-10-13  
呵呵,我也在摸索阶段,谢谢提醒
ligywin 写道
还需要补充以下方法

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.cas.authentication.principal.CredentialsToPrincipalResolver;
import org.jasig.cas.authentication.principal.Credentials;
import org.jasig.cas.authentication.principal.Principal;
import org.jasig.cas.authentication.principal.SimplePrincipal;

public final class NbrcCredentialsToPrincipalResolver implements
     CredentialsToPrincipalResolver {

     /** Logging instance. */
     private final Log log = LogFactory.getLog(getClass());

     public Principal resolvePrincipal(final Credentials credentials) {
         final NbrcCredentialsciatCredentials = (NbrcCredentials) credentials;

         if (log.isDebugEnabled()) {
             log.debug("Creating SimplePrincipal for ["
                 + ciatCredentials.getUsername() + "]");
         }

         return new SimplePrincipal(ciatCredentials.getUsername());
     }

     public boolean supports(final Credentials credentials) {
         return credentials != null
             && NbrcCredentials.class.isAssignableFrom(credentials
                 .getClass());
     }
}

1 楼 ligywin 2013-10-11  
还需要补充以下方法

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.cas.authentication.principal.CredentialsToPrincipalResolver;
import org.jasig.cas.authentication.principal.Credentials;
import org.jasig.cas.authentication.principal.Principal;
import org.jasig.cas.authentication.principal.SimplePrincipal;

public final class NbrcCredentialsToPrincipalResolver implements
     CredentialsToPrincipalResolver {

     /** Logging instance. */
     private final Log log = LogFactory.getLog(getClass());

     public Principal resolvePrincipal(final Credentials credentials) {
         final NbrcCredentialsciatCredentials = (NbrcCredentials) credentials;

         if (log.isDebugEnabled()) {
             log.debug("Creating SimplePrincipal for ["
                 + ciatCredentials.getUsername() + "]");
         }

         return new SimplePrincipal(ciatCredentials.getUsername());
     }

     public boolean supports(final Credentials credentials) {
         return credentials != null
             && NbrcCredentials.class.isAssignableFrom(credentials
                 .getClass());
     }
}

相关推荐

    CAS单点登录 CODE+讲解

    由于登录界面发生改变,请求参数增加了账号所在的系统名称,所以,登录凭据也不能继续使用UsernamePasswordCredentials,而是要自定义一个包含了系统名称的Credentials,并进行配置让CAS服务器启用这个自定义的...

    cas单点登录系统

    cas单点登录系统,带源码,可定制开发;CASServer负责完成对用户的认证工作,CASServer需要独立部署,CASServer处理用户名/密码等凭证(Credentials)验证,它可能会到数据库检索一条用户帐号信息,也可能在XML文件中...

    cas

    标签“源码”意味着文章可能涵盖了CAS的内部实现,包括代码结构、关键类或模块的功能,这对于开发者来说是非常有价值的资源,因为理解源码可以帮助他们自定义CAS以满足特定需求。 另一个标签“工具”暗示CAS作为一...

    Spring MVC Security-添加自定义登录表单,显示无效凭据、基于角色的访问、自定义访问被拒绝的错误消息.zip

    这个压缩包包含的项目"SpringMVCSecurity-master"很可能是用来演示如何配置和使用Spring Security来实现自定义登录表单、处理无效凭证、基于角色的访问控制以及自定义访问拒绝错误消息的示例代码。 在Spring ...

    credentials-java-0.2.4.jar

    credentials-java-0.2.4.jar

    cas client cas server

    - **bindAndValidate**: 收集用户在登录页面输入的信息,并封装成 CAS 内部的 `Credentials` 对象。 - **submit**: 调用 `centralAuthenticationService` 的 `grantServiceTicket` 方法来完成认证工作。如果认证成功...

    Win7认证示例CredentialProviders

    使用 Windows Vista 的凭据提供程序创造自定义的登录体验 Windows Vista 在平台集成方面为开发人员提供了许多新的机会。新的凭据提供程序模型是变动最大的方面之一,由于它的出现,实现操作系统支持的新用户身份验证...

    Laravel开发-credentials

    "Laravel开发-credentials"指的是Laravel 5版本中引入的一种高效的身份验证机制,它旨在简化和加强用户认证流程。让我们深入探讨一下这个话题。 首先,Laravel的凭据(Credentials)主要涉及到用户登录时输入的...

    jenkins credentials-plugin1.11.hpi

    Credentials Plugin version:1.11 download from github,and have build it by: Run mvn clean package to create the plugin .hpi file. To install: 1. copy the resulting ./target/credentials.hpi file ...

    acegi集成CAS示例

    CAS(Central Authentication Service)则是一个开放源码的身份验证系统,它允许用户通过单一登录(Single Sign-On, SSO)访问多个应用系统,大大简化了用户管理和权限控制。 在"acegi集成CAS示例"中,我们主要探讨...

    Python库 | alibabacloud_credentials-0.0.3.tar.gz

    python库。 资源全名:alibabacloud_credentials-0.0.3.tar.gz

    Python-使用GmailAPI和Python发送多个自定义电子邮件

    这段代码会打开一个本地Web服务器,引导用户通过Google登录并授权应用访问Gmail API。授权成功后,它会返回认证凭据,这些凭据用于后续的API调用。 现在我们可以编写发送邮件的函数。这里假设我们有一个包含收件人...

    pac4j:Java的安全引擎(身份验证,授权,多框架):OAuth,CAS,SAML,OpenID Connect,LDAP,JWT。

    pac4j是Java的一个简单而强大的安全引擎,用于对用户进行身份验证,获取其个人资料并管理授权,以保护Web应用程序和Web服务的安全。 它提供了一套完整的。 它基于Java 8,并在Apache 2许可下可用。...

    Invalid Login Credentials(解决方案).md

    Invalid Login Credentials(解决方案).md

    JA-SIG(CAS)学习笔记3.doc

    JA-SIG CAS是其最初的开发者,它允许用户通过一个统一的登录界面访问多个相互独立的应用系统,从而简化了用户的登录体验。 CAS Server是CAS的核心组件,它负责处理用户的认证请求。在我们讨论的环境中,CAS Server ...

    jenkins ssh-credentials-plugin 1.6.1 phi

    copy the resulting ./target/credentials.hpi file to the $JENKINS_HOME/plugins directory. Don't forget to restart Jenkins afterwards. 2. or use the plugin management console ...

    Windows Credentials Viewer(浏览器检测工具) v1.2免费版.zip

    Windows Credentials Viewer是一款用来查找浏览器存储凭据的小工具,帮助您检索在Firefox,Chrome或Internet Explorer中随时间存储的凭据。 用户友好和干净的界面,该应用程序不需要安装或配置,直接打开就可以使用...

    Laravel开发-credentials .zip

    在这个"credentials"项目中,我们可能涉及到的身份验证、授权、密码重置、API令牌管理和用户权限控制等关键概念。 1. **身份验证(Authentication)**:Laravel提供了开箱即用的身份验证系统,包括登录、注册、会话...

    Python库 | infi.credentials_store-0.1.8.tar.gz

    3. **桌面应用程序**:对于需要用户登录或需要访问外部资源的桌面应用,`infi.credentials_store`可以用来存储用户的登录信息。 4. **Web服务**:在后端服务器中,它可以帮助安全地存储数据库连接信息、第三方服务...

Global site tag (gtag.js) - Google Analytics