CAS-SSO-VUE,前后端分离模式单点登录DEMO

一.服务端版本使用5.3.16

网上一大堆的,反正就是下载服务端,然后windows就 ./build.cmd run 下载包,能单独访问即可,配置http使用模式这些...等等..此处就不说了,本文只是简单记录客户端采坑后的处理过程

二.客户端

2.1 主要流程

 2.2 客户端导包(其他的spring的包忽略未写)

<dependency>
    <groupId>net.unicon.cas</groupId>
    <artifactId>cas-client-autoconfig-support</artifactId>
    <version>2.3.0-GA</version>
</dependency>

2.3 配置文件

 

server.port=8081
# cas服务端前缀
cas.server-url-prefix=http://192.168.124.14:8086/cas
# cas服务端登录页面
cas.server-login-url=http://192.168.124.14:8086/cas/login
# 客户端
cas.client-host-url=http://192.168.124.14:8081
#验证类型: Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=cas3

2.4 主要的2个java类 

2.4.1 配置类


import net.unicon.cas.client.configuration.CasClientConfigurerAdapter;
import net.unicon.cas.client.configuration.EnableCasClient;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Map;


@Configuration
public class CasClientConfig extends CasClientConfigurerAdapter {
    @Override
    public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) {
        super.configureAuthenticationFilter(authenticationFilter);
        Map<String, String> initParameters = authenticationFilter.getInitParameters();
//        initParameters.put("authenticationRedirectStrategyClass","xxx.xxx.CustomAuthRedirectStrategy");
        // 配置地址,这里还可以配置很多,例如cas重定向策略等。
        initParameters.put("ignorePattern", "/ignoreUrl1/|/ignoreUrl2/|/ignoreUrl3/");
    }

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
      	//前端页面地址,可以配置多个
        config.addAllowedOrigin("http://192.168.124.14:8081");
        config.addAllowedOrigin("http://192.168.124.14:8082");
        config.addAllowedOrigin("http://192.168.124.14:8083");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new CorsFilter(source));
        //需要拦截的url
        registrationBean.addUrlPatterns("/url1/*");
      	registrationBean.addUrlPatterns("/url2/*");
      	registrationBean.addUrlPatterns("/url3/*");
        registrationBean.setOrder(-2147483648);
        return registrationBean;
    }
}

2.4.2 测试的请求Controller,至于为啥要重定向请求,再重定向页面,原理还没研究出来,不然就会302跨域


import org.jasig.cas.client.authentication.AttributePrincipal;
import org.jasig.cas.client.validation.Assertion;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

import static java.lang.System.out;
import static org.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION;

@Controller // 这里不能用@RestController否则请求重定向不行
@RequestMapping("/")
public class LoginController {

    @ResponseBody
    @RequestMapping("/userInfo")
    public String userInfo(HttpSession session){
        Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION);
        AttributePrincipal principal = assertion.getPrincipal();
        String loginName = principal.getName();
        out.println("loginName = " + loginName);
        return "sso-test1,当前登录账户"+loginName;
    }

    @RequestMapping("/login")
    public String login(HttpSession session){
        Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION);
        AttributePrincipal principal = assertion.getPrincipal();
        String loginName = principal.getName();
        out.println("loginName = " + loginName);
        return "redirect:/toRedirect";
    }


    @RequestMapping(value = "toRedirect", method = RequestMethod.GET)
    public void redirect(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        HttpSession session = request.getSession();
        response.addHeader("Access-Control-Allow-Credentials", "true");
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setHttpOnly(true);
        cookie.setPath("/");
        cookie.setMaxAge(3600);
        //explain: 这里的前端就只做了一件事,就是调用 /userIndo的请求,只是看能否登录而已..所以前端代码不粘贴了
        String urlToRedirectTo = "http://192.168.124.14:8082/index"; // 前端index
        out.println("urlToRedirectTo = " + urlToRedirectTo + ";;;; JSESSIONID = " + session.getId());
        response.addCookie(cookie);
        //重定向到前端页面
        response.sendRedirect(urlToRedirectTo);
    }


}

 2.5 测试顺序就按上面的流程图来的

1. 访问http://client-ip:8081/login (未登陆情况))
2. http://cas-service-ip:8086/cas/login?service=http://client-ip:8081/login (重定向到cas的登录页)
3. 登陆
4. 跳转到请求:http://client-ip:8081/login => 重定向至 http://vue-client-ip:8083/index
5. vue请求后端接口: http://client-ip:8081/userInfo
6. 获取正常的登录用户信息
7. 同一浏览器访问http://client2-ip:8082/login (客户端2,  客户端1已登录情况[上述6步已完成了])
8. cas验证通过直接重定向至http://client2-ip:8082/login => 重定向至 http://vue-client2-ip:8084/index
9. vue请求后端接口: http://client2-ip:8082/userInfo => 获取正常的登录用户信息

3. 至此登录的搞定了...登出的还未写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
# sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的是MySQL5.0,数据库名为db_test 3. spring-node-1: 应用1 4. spring-node-2: 应用2 其中node1跟node2都是采用spring + springMVC + mybatis 框架,使用maven做项目管理 ## cas集成说明 1.首先采用的是查数据库的方式来校验用户身份的,在cas/WEB-INF/deployerConfigContext.xml中第135行构建了这个类型 ``` xml ``` 其中QueryDatabaseAuthenticationHandler这个类是自定义构建的,在cas/WEB-INF/lib/cas-jdbc-1.0.0.jar里面,有兴趣的同学可以发编译看下,关于几个属性的说明 1. dataSource: 数据源,配置MySQL的连接信息 2. passwordEncoder: 加密方式,这里用的是MD5 3. sql: sql查询语句,这个语句就是根据用户输入的账号查询其密码 #### 以上就是单点登录管理的主要配置 ## 应用系统的配置node1 1. 应用系统采用shiro做权限控制,并且跟cas集成 2. 在/spring-node-1/src/main/resources/conf/shiro.properties 文件中 ``` properties shiro.loginUrl=http://127.0.0.1:8080/cas/login?service=http://127.0.0.1:8081/node1/shiro-cas shiro.logoutUrl=http://127.0.0.1:8080/cas/logout?service=http://127.0.0.1:8081/node1/shiro-cas shiro.cas.serverUrlPrefix=http://127.0.0.1:8080/cas shiro.cas.service=http://127.0.0.1:8081/node1/shiro-cas shiro.failureUrl=/users/loginSuccess shiro.successUrl=/users/loginSuccess ``` 其中shiro.loginUrl 跟 shiro.logoutUrl的前面是cas验证的地址,后面的是我们应用系统的地址,这样配置的方式是为了在访问我们的应用系统的时候,先到cas进行验证,如果验证成功了,cas将重定向到shiro.successUrl 所表示的地址 3.在/spring-node-1/src/main/resources/conf/shiro.xml 文件中 ``` xml /shiro-cas = casFilter /logout = logoutFilter /users/** = user ``` > 其中shiroFilter这个类主要用于需要拦截的url请求,需要注意的是这个是shiro的拦截,我们还需要配置cas的过滤配置casFilter > casRealm这个类是需要我们自己实现的,主要用于shiro的权限验证,里面的属性说明如下 1. defaultRoles: 默认的角色 2. casServerUrlPrefix: cas地址 3. casService: 系统应用地址 最后我们还需要在/spring-node-1/src/main/webapp/WEB-INF/web.xml 文件中配置相关的过滤器拦截全部请求 ``` xml shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /* ``` ## 系统运行 1. 端口说明,cas:8080,node1:8081,node2:8082,大家可以采用maven提供的tomcat7插件,配置如下: ``` xml org.apache.tomcat.maven tomcat7-maven-plugin 2.1 8081 UTF-8 tomcat7 /node1 ``` 这样的配置,我们甚至都不需要配置tomcat服务器了,建议这种方式 2.各个模块的访问地址 > cas:http://127.0.0.1:8080/cas > node1:http://127.0.0.1:8081/node1 > node2:http://127.0.0.1:8082/node2 3.访问系统 > 输入 http://127.0.0.1:8081/node1/shiro-cas ,进入cas验证 > 输入用户名 admin,密码 admin@2015,验证成功后将会重定向到http://127.0.0.1:8081/node1//users/loginSuccess ,也就是node1系统的主页,里面的节点2代表的是node2系统的主页,你会发现我们不需要登录到node2系统就能访问其中的系统了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值