文档章节

CAS-Client客户端研究(四)-HttpServletRequestWrapperFilter

abcijkxyz
 abcijkxyz
发布于 2016/07/08 16:28
字数 426
阅读 34
收藏 0

最近研究CAS,先从客户开始来说明CAS的逻辑,可能会结合源代码。

必要说明:http://blog.csdn.net/yuwenruli/article/details/6602180

HttpServletRequestWrapperFilter其实作用很简单,就是在HttpServletRequest对象再包装一次,让其支持getUserPrincipal,getRemoteUser方法来取得登录的用户信息。

实现起来比较简单,这个里面使用到一个类CasHttpServletRequestWrapper,其继承HttpServletRequestWrapper,通过给定Assertion对象中取得AttributePrincipal对象来组装CasHttpServletRequestWrapper,看看源代码

public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        //从Session或者request中取得AttributePrincipal,其实Assertion的一个principal属性
    	final AttributePrincipal principal = retrievePrincipalFromSessionOrRequest(servletRequest);
    	//对request进行包装,并处理后面的过滤器,使其后面的过滤器或者servlet能够在request.getRemoteUser()或者request.getUserPrincipal()取得用户信息
        filterChain.doFilter(new CasHttpServletRequestWrapper((HttpServletRequest) servletRequest, principal), servletResponse);
    }

    protected AttributePrincipal retrievePrincipalFromSessionOrRequest(final ServletRequest servletRequest) {
        final HttpServletRequest request = (HttpServletRequest) servletRequest;
        final HttpSession session = request.getSession(false);
        final Assertion assertion = (Assertion) (session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION));

        return assertion == null ? null : assertion.getPrincipal();
    }

我们再来看看CasHttpServletRequestWrapper的源代码

final class CasHttpServletRequestWrapper extends HttpServletRequestWrapper {

        private final AttributePrincipal principal;

        CasHttpServletRequestWrapper(final HttpServletRequest request, final AttributePrincipal principal) {
            super(request);
            this.principal = principal;
        }

        public Principal getUserPrincipal() {
            return this.principal;
        }

        public String getRemoteUser() {
            return principal != null ? this.principal.getName() : null;
        }

        public boolean isUserInRole(final String role) {
            if (CommonUtils.isBlank(role)) {
                log.debug("No valid role provided.  Returning false.");
                return false;
            }

            if (this.principal == null) {
                log.debug("No Principal in Request.  Returning false.");
                return false;
            }

            if (CommonUtils.isBlank(roleAttribute)) {
                log.debug("No Role Attribute Configured. Returning false.");
                return false;
            }

            final Object value = this.principal.getAttributes().get(roleAttribute);
            
            if (value instanceof Collection<?>) {
                for (final Object o : (Collection<?>) value) {
                    if (rolesEqual(role, o)) {
                        log.debug("User [" + getRemoteUser() + "] is in role [" + role + "]: " + true);
                        return true;
                    }
                }
            }

            final boolean isMember = rolesEqual(role, value);
            log.debug("User [" + getRemoteUser() + "] is in role [" + role + "]: " + isMember);
            return isMember;
        }
        
        /**
         * Determines whether the given role is equal to the candidate
         * role attribute taking into account case sensitivity.
         *
         * @param given  Role under consideration.
         * @param candidate Role that the current user possesses.
         *
         * @return True if roles are equal, false otherwise.
         */
        private boolean rolesEqual(final String given, final Object candidate) {
            return ignoreCase ? given.equalsIgnoreCase(candidate.toString()) : given.equals(candidate);
        }
    }



本文转载自:http://blog.csdn.net/yuwenruli/article/details/6602667

abcijkxyz
粉丝 64
博文 6421
码字总数 1876
作品 0
深圳
项目经理
私信 提问
SSO之CAS单点登录详细搭建

SSO之CAS单点登录详细搭建 : 环境说明: 同一个机器上环境如下: 操作系统:windows7 64位 JDK版本:1.7.0_80 web容器版本:apache-tomcat-7.0.70 64位 服务端:cas-3.5.2.1.zip 服务端现在...

小卒-terry
2016/09/13
188
0
单点登录研究

作者:近乎团队 1 单点登录起因和概念 现代企业一般拥有多套业务系统,传统方式下,各业务系统分别维护用户的帐号密码,拥有各自独立的用户信息,这就导致了以下问题: • 用户使用不便:需要...

小近
2014/11/04
875
0
CAS实现单点登录(SSO)经典完整教程

一、简介 1、cas是有耶鲁大学研发的单点登录服务器 2、本教材所用环境 · Tomcat7.2 · JDK6 · CAS Service 版本 cas-server-3.4.8-release · CAS Client版本 cas-client-3.2.1-release 二...

yuke198907
2014/05/28
0
0
关于cas单点登录的问题

客户端项目配置cas后,访问所有内容都必须在登录的前提下,如果想不登陆也能访问,只在用户点击登陆或者访问某些特殊内容才跳转到登录该怎么做 cas-server-3.5.2.1 和 cas-client-3.2.1 客户...

白小衣
2014/08/23
1K
2
CAS中客户端怎么获取Server端的session信息。

小弟最近在研究CAS单点登录系统,遇到点问题: 登录成功后跳转到客户端页面后,发现,仅仅只是跳转了,但是登录信息都没有返回到客户端, 我想知道在客户端怎么调用server端登陆时候开始的 ...

leiboo
2014/04/23
4.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

c语言实现Sqlite3的创建db和增删改查db操作

SQLite,是一款轻型的数据库,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中使用广泛,现在准备学习一下sqlite3的使用方法并写一个测试demo,后面在项目智能...

jorin_zou
11分钟前
2
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第2题

choose three Which three are true about the CREATE TABLE command? A) It can include the CREATE...INDEX statement for creating an index to enforce the primary key constraint. B) ......

oschina_5359
14分钟前
3
0
如何在二维码中循环批量插入图片

现在二维码种类比较多,为了突出二维码的个性及吸引客户,很多朋友都喜欢在二维码上插入图片。想要每个二维码都与众不同,但是有的时候需要批量插入图片数量有限,如果制作的二维码比较多的话...

中琅软件
15分钟前
2
0
LTR那点事—AUC及其与线上点击率的关联详解

LTR(Learning To Rank)学习排序是一种监督学习(SupervisedLearning)的排序方法,现已经广泛应用于信息索引,内容推荐,自然语言处理等多个领域。以推荐系统为例,推荐一般使用多个子策略...

达观数据
15分钟前
3
0
IntelliJ 如何显示代码的代码 docs

希望能够在 IntelliJ 代码上面显示方法的 docs。 如何进行显示? 你可以使用 Ctrl + Q 这个快捷键来查看方法的 Docs。 https://blog.ossez.com/archives/3061...

honeymoose
18分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部