David.Turing's blog

 

CAS如何跟普通的Web系统融合认证和授权

CAS的作用是负责单点登录,登录细节当然要自己写,CAS3有一个这样的AuthenticationHandler 接口,继承关系如下
1,AbstractAuthenticationHandler implements AuthenticationHandler
2,AbstractUsernamePasswordAuthenticationHandler extends AbstractAuthenticationHandler

AbstractUsernamePasswordAuthenticationHandler 正是你认证管理的着手点,你写一个类,如WeblogicAuthenticanHandler去扩展它。

你先看看下面的接口:

public interface AuthenticationHandler {

    /**
     * Method to determine if the credentials supplied can be authenticated.
     *
     * @param credentials The credentials to authenticate
     * @return true if authenticated and false they are not
     * @throws AuthenticationException An AuthenticationException can contain details about why a particular authentication request failed.
     * AuthenticationExceptions contain code/desc.
     */
    boolean authenticate(Credentials credentials) throws AuthenticationException;
}


authenticate这个接口是每个Hander都必须实现,当然,AbstractHandler将它转交给 authenticateInternal 方法去实现。

认证有两种情况,成功或者失败,true or false。
我使用Weblogic的LoginModule

loginContext = new LoginContext("WeblogicUsernamePasswordModule", new WeblogicCallbackHandler(username, password, url));

它抛出个各种不同的认证异常让我轻松判断认证过程中发生了什么事情,
     /**
      * Attempt authentication
      */
     try
     {
       // If we return without an exception, authentication succeeded
       loginContext.login();
     }
     catch(FailedLoginException fle)
     {
       System.out.println("Authentication Failed, " + fle.getMessage());
       loginsccess=false;
     }
     catch(AccountExpiredException aee)
     {
       System.out.println("Authentication Failed: Account Expired");
       loginsccess=false;
     }
     catch(CredentialExpiredException cee)
     {
       System.out.println("Authentication Failed: Credentials Expired");
       loginsccess=false;
     }
     catch(Exception e)
     {
       System.out.println("Authentication Failed: Unexpected Exception, " + e.getMessage());
       loginsccess=false;
     }

如果一切正常,授权开始了。

     if(loginsccess==true)
     {
      /**
       * Retrieve authenticated subject, perform SampleAction as Subject
       */
      subject = loginContext.getSubject();
      System.out.println("User["+ username+"]["+ password+"] Login Success, Subject is"+subject.toString());
      return true;
     }
     else
     {
      System.out.println("User["+ username+"]["+ password+"] Login Fail, Check!!!!!");
      return false;
     }

OK,获得了Subject,那你就可以获得principal,编程式授权便有了依据。
同时,你还可以用Weblogic的声明式授权,直接在web.xml中定义资源的授权规则。

更多关于认证授权,请看[Weblogic Security In Action]
http://dev2dev.bea.com.cn/bbs/servlet/D2DServlet/download/81-26770-158358-1697/WeblogicSecurityInAction(1).swf

posted on 2006-02-09 13:50 david.turing 阅读(4173) 评论(4)  编辑  收藏 所属分类: Security领域

评论

# re: CAS如何跟普通的Web系统融合认证和授权 2007-01-25 00:15 sunky

授权开始了?

别搞笑了,授权是在cas-client进行的,对于cas-client,根本没考虑跟JAVAEE安全的集成  回复  更多评论   

# re: CAS如何跟普通的Web系统融合认证和授权 2007-01-25 00:17 sunky

我对本BLOG的主人绝对表示敬意,能把自己的研究成果共享出来就是了不起的,但某些观点还是不正确的,我对前面过激言论表示道歉。  回复  更多评论   

# re: CAS如何跟普通的Web系统融合认证和授权 2007-01-25 00:25 sunky

并不想夸夸其谈。还是说点自己的建议吧

授权如何跟应用服务器集成这一点,有很多种方案,无外乎如何让应用服务器认识已经认证成功的用户身份。这又视乎应用服务器厂商提供何种方案。比如,应由用服务器厂商与CAS紧密集成,通过配置,如果是CAS认证,则在认证中心认证后,在应用服务器的认证模块中添加认证到CAS认证中心的模块,以便认证中心的判断;或者,应用服务器厂商提供接口,由SSO解决方案提供商实现到应用服务器的认证。还有别的方案,但不如前面提到的两种方案这么方便。  回复  更多评论   

# re: CAS如何跟普通的Web系统融合认证和授权 2007-01-25 10:12 david.turing

1,认证跟授权分离, 可以实现组件甚至应用服务的分离.
2,得益于1,因此,我们可以将原先各个独立的应用服务器系统中认证模块抽取到一个单点,做一个Single Sign-On
3,于是原先的公式是
N个认证模块+N个授权模块=>1个认证模块+N个授权模块
你考虑的问题最终会体现实认证的互操作性,但目标仍然没有脱离统一认证这个需求.
但考虑到各个应用集成商之间对认证过程的不同实现标准, 的确需要一个统一的认证接口, SAML会是一个很好的开始.
但前提是你是否充分理解了,在SSO的过程中,协议是如何安全地传递用户的Credential,这一点非常关键, 以致于你提问题的方式也会有所不同.   回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(110)

我参与的团队

随笔分类(126)

随笔档案(155)

文章分类(9)

文章档案(19)

相册

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜