添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

此次项目向使用RuoYi-Vue版本做开发,需要进行单点登录,在做完一次集成后形成了这篇文章,有不足之处望请谅解。因为前后端分离版本和不分离版本有区别集成方式也不太一样,主要区分是在单点登录退出后跨域重定向的问题上,以下是我这次集成的步骤:

一、后端集成

1. 添加对CAS的支持

在common项目中添加对cas的支持,RuoYi-Vue版本使用的是Security权限框架,所以添加securyti-cas依赖即可:

<!-- 添加spring security cas支持 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-cas</artifactId>
</dependency>

2.修改LoginUser.java

由于CAS认证需要authorities属性,此属性不能为空,此处为了方便直接new HashSet():

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
   return new HashSet();

3.修改Constants.java

添加CAS认证成功标识:

* CAS登录成功后的后台标识 public static final String CAS_TOKEN = "cas_token"; * CAS登录成功后的前台Cookie的Key public static final String WEB_TOKEN_KEY = "Admin-Token";

4.添加CasPropertys.java

此类为读取cas配置信息:

package com.ruoyi.framework.config.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 * CAS的配置参数
@Component
public class CasProperties {
    @Value("${cas.server.host.url}")
    private String casServerUrl;
    @Value("${cas.server.host.login_url}")
    private String casServerLoginUrl;
    @Value("${cas.server.host.logout_url}")
    private String casServerLogoutUrl;
    @Value("${app.server.host.url}")
    private String appServerUrl;
    @Value("${app.login_url}")
    private String appLoginUrl;
    @Value("${app.logout_url}")
    private String appLogoutUrl;
    @Value("${app.web_url}")
    private String webUrl;
    public String getWebUrl() {
        return webUrl;
    public String getCasServerUrl() {
        return casServerUrl;
    public void setCasServerUrl(String casServerUrl) {
        this.casServerUrl = casServerUrl;
    public String getCasServerLoginUrl() {
        return casServerLoginUrl;
    public void setCasServerLoginUrl(String casServerLoginUrl) {
        this.casServerLoginUrl = casServerLoginUrl;
    public String getCasServerLogoutUrl() {
        return casServerLogoutUrl;
    public void setCasServerLogoutUrl(String casServerLogoutUrl) {
        this.casServerLogoutUrl = casServerLogoutUrl;
    public String getAppServerUrl() {
        return appServerUrl;
    public void setAppServerUrl(String appServerUrl) {
        this.appServerUrl = appServerUrl;
    public String getAppLoginUrl() {
        return appLoginUrl;
    public void setAppLoginUrl(String appLoginUrl) {
        this.appLoginUrl = appLoginUrl;
    public String getAppLogoutUrl() {
        return appLogoutUrl;
    public void setAppLogoutUrl(String appLogoutUrl) {
        this.appLogoutUrl = appLogoutUrl;

5.添加CasUserDetailsService.java

在framework项目下添加:

package com.ruoyi.framework.web.service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
 * 用于加载用户信息 实现UserDetailsService接口,或者实现AuthenticationUserDetailsService接口
 * @author HuXiao
@Service
public class CasUserDetailsService implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
    private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
    @Autowired
    private ISysUserService userService;
    @Autowired
    private SysPermissionService permissionService;
    public UserDetails createLoginUser(SysUser user) {
        return new LoginUser(user, permissionService.getMenuPermission(user));
    @Override
    public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
        String username = token.getName();
        SysUser user = userService.selectUserByUserName(username);
        if (StringUtils.isNull(user)) {
            log.info("登录用户:{} 不存在.", username);
            throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
        } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
            log.info("登录用户:{} 已被删除.", username);
            throw new BaseException("对不起,您的账号:" + username + " 已被删除");
        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
            log.info("登录用户:{} 已被停用.", username);
            throw new BaseException("对不起,您的账号:" + username + " 已停用");
        return createLoginUser(user);

6.添加CasAuthenticationSuccessHandler.java

也是在framework项目下:

package com.ruoyi.framework.security.handle;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.config.properties.CasProperties;
import com.ruoyi.framework.web.service.TokenService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@Service
public class CasAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    protected final Log logger = LogFactory.getLog(this.getClass());
    private RequestCache requestCache = new HttpSessionRequestCache();
    @Autowired
    private TokenService tokenService;
    @Autowired
    private CasProperties casProperties;
    // 令牌有效期(默认30分钟)
    @Value("${token.expireTime}")
    private int expireTime;
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                        Authentication authentication) throws ServletException, IOException {
        String targetUrlParameter = getTargetUrlParameter();
        if (isAlwaysUseDefaultTargetUrl()
                || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) {
            requestCache.removeRequest(request, response);
            super.onAuthenticationSuccess(request, response, authentication);
            return;
        clearAuthenticationAttributes(request);
        LoginUser userDetails = (LoginUser) authentication.getPrincipal();
        String token = tokenService.createToken(userDetails);
        //往Cookie中设置token
        Cookie casCookie = new Cookie(Constants.WEB_TOKEN_KEY, token);
        casCookie.setMaxAge(expireTime * 60);
        response.addCookie(casCookie);
        //设置后端认证成功标识
        HttpSession httpSession = request.getSession();
        httpSession.setAttribute(Constants.CAS_TOKEN, token);
        //登录成功后跳转到前端登录页面
        getRedirectStrategy().sendRedirect(request, response, casProperties.getWebUrl());

6.修改SecurityConfig

添加cas的处理逻辑:

package com.ruoyi.framework.config;
import com.ruoyi.framework.config.properties.CasProperties;
import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
import com.ruoyi.framework.security.handle.CasAuthenticationSuccessHandler;
import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
import com.ruoyi.framework.web.service.CasUserDetailsService;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.cas.ServiceProperties;
import org.springframework.security.cas.authentication.CasAuthenticationProvider;
import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
import org.springframework.security.cas.web.CasAuthenticationFilter;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.web.filter.CorsFilter;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CasProperties casProperties;
    @Autowired
    private CasUserDetailsService customUserDetailsService;
    @Autowired
    private CasAuthenticationSuccessHandler casAuthenticationSuccessHandler;
    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
     * 退出处理类
    @Autowired
    private LogoutSuccessHandlerImpl logoutSuccessHandler;
     * 跨域过滤器
    @Autowired
    private CorsFilter corsFilter;
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                // CSRF禁用,因为不使用session
                .csrf().disable()
                // 基于token,所以不需要session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                // 过滤请求
                .authorizeRequests()
                // 对于登录login 验证码captchaImage 允许匿名访问
                //.antMatchers("/login", "/captchaImage").anonymous()
                .antMatchers(
                        HttpMethod.GET,
                        "/*.html",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js"
                ).permitAll()
                .antMatchers("/profile/**").anonymous()
                .antMatchers("/common/download**").anonymous()
                .antMatchers("/common/download/resource**").anonymous()
                .antMatchers("/swagger-ui.html").anonymous()
                .antMatchers("/swagger-resources/**").anonymous()
                .antMatchers("/webjars/**").anonymous()
                .antMatchers("/*/api-docs").anonymous()
                .antMatchers("/druid/**").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated()
                .and()
                .headers().frameOptions().disable();
        //单点登录登出
        httpSecurity.logout().permitAll().logoutSuccessHandler(logoutSuccessHandler);
        // Custom JWT based security filter
        httpSecurity.addFilter(casAuthenticationFilter())
                .addFilterBefore(jwtAuthenticationTokenFilter, CasAuthenticationFilter.class)
                //.addFilterBefore(casLogoutFilter(), LogoutFilter.class)
                .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class).exceptionHandling()
                .authenticationEntryPoint(casAuthenticationEntryPoint());
        // 添加CORS filter
        httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
        httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
        // disable page caching
        httpSecurity.headers().cacheControl();
     * 解决 无法直接注入 AuthenticationManager
     * @return
     * @throws Exception
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
     * 定义认证用户信息获取来源,密码校验规则等
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
        auth.authenticationProvider(casAuthenticationProvider());
     * 认证的入口
    @Bean
    public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
        CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
        casAuthenticationEntryPoint.setLoginUrl(casProperties.getCasServerLoginUrl());
        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
        return casAuthenticationEntryPoint;
     * 指定service相关信息
    @Bean
    public ServiceProperties serviceProperties() {
        ServiceProperties serviceProperties = new ServiceProperties();
        serviceProperties.setService(casProperties.getAppServerUrl() + casProperties.getAppLoginUrl());
        serviceProperties.setAuthenticateAllArtifacts(true);
        return serviceProperties;
     * CAS认证过滤器
    @Bean
    public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
        CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
        casAuthenticationFilter.setAuthenticationManager(authenticationManager());
        casAuthenticationFilter.setFilterProcessesUrl(casProperties.getAppLoginUrl());
        casAuthenticationFilter.setAuthenticationSuccessHandler(casAuthenticationSuccessHandler);
        return casAuthenticationFilter;
     * cas 认证 Provider
    @Bean
    public CasAuthenticationProvider casAuthenticationProvider() {
        CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
        casAuthenticationProvider.setAuthenticationUserDetailsService(customUserDetailsService);
        casAuthenticationProvider.setServiceProperties(serviceProperties());
        casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator());
        casAuthenticationProvider.setKey("casAuthenticationProviderKey");
        return casAuthenticationProvider;
    @Bean
    public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
        return new Cas20ServiceTicketValidator(casProperties.getCasServerUrl());
     * 单点登出过滤器
    @Bean
    public SingleSignOutFilter singleSignOutFilter() {
        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
        singleSignOutFilter.setCasServerUrlPrefix(casProperties.getCasServerUrl());
        singleSignOutFilter.setIgnoreInitConfiguration(true);
        return singleSignOutFilter;
     * 请求单点退出过滤器
    @Bean
    public LogoutFilter casLogoutFilter() {
        LogoutFilter logoutFilter = new LogoutFilter(casProperties.getCasServerLogoutUrl(),
                new SecurityContextLogoutHandler());
        logoutFilter.setFilterProcessesUrl(casProperties.getAppLogoutUrl());
        return logoutFilter;

7.修改配置文件

在admin项目下的application.yml配置文件中添加:

server: host: #CAS服务地址 url: http://localhost:9090/cas #CAS服务登录地址 login_url: ${cas.server.host.url}/login #CAS服务登出地址 logout_url: ${cas.server.host.url}/logout?service=${app.server.host.url} # 应用访问地址 server: host: url: http://localhost:${server.port} login_url: / #应用登录地址 logout_url: /logout #应用登出地址 web_url: http://localhost:1024/index #前端登录地址

至此,后端配置已完毕,不出意外启动项目后访问项目路径即可跳转到cas登录界面。

二、前端配置

1.修改settings.js

 添加cas登录和登出地址方便访问:

* 单点登录url casloginUrl: 'http://localhost:9090/cas/login?service=http://localhost:8080', * 单点登出url caslogoutUrl: 'http://localhost:9090/cas/logout?service=http://localhost:8080'

2.修改permission.js

判断没有token时访问cas登录页面:

import router from './router'
import store from './store'
import {Message} from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import {getToken} from '@/utils/auth'
NProgress.configure({showSpinner: false})
const whiteList = ['/auth-redirect', '/bind', '/register']
const defaultSettings = require('./settings.js')
router.beforeEach((to, from, next) => {
  NProgress.start()
  if (getToken()) {
    if (store.getters.roles.length === 0) {
      // 判断当前用户是否已拉取完user_info信息
      store.dispatch('GetInfo').then(() => {
        store.dispatch('GenerateRoutes').then(accessRoutes => {
          // 根据roles权限生成可访问的路由表
          router.addRoutes(accessRoutes) // 动态添加可访问路由表
          next({...to, replace: true}) // hack方法 确保addRoutes已完成
      }).catch(err => {
        store.dispatch('LogOut').then(() => {
          Message.error(err)
          next({path: '/'})
    } else {
      next()
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单,直接进入
      next()
    } else {
      //next('index') // 否则全部重定向到登录页
      window.location.href = defaultSettings.casloginUrl
      NProgress.done()
router.afterEach(() => {
  NProgress.done()

3.修改request.js,Navbar.vue

登出后不做响应:

if (code === 401) {
      MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
      ).then(() => {
        store.dispatch('LogOut').then(() => {
          //location.href = '/index';
methods: {
    toggleSideBar() {
      this.$store.dispatch('app/toggleSideBar')
    async logout() {
      this.$confirm('确定注销并退出系统吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$store.dispatch('LogOut').then(() => {
          //location.href = '/index';

4,修改user.js

登出后跳转到cas登出页面:

LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
        logout(state.token).then(() => {
          commit('SET_TOKEN', '')
          commit('SET_ROLES', [])
          commit('SET_PERMISSIONS', [])
          removeToken()
          resolve()
          location.href=defaultSettings.caslogoutUrl
        }).catch(error => {
          reject(error)

至此,前端代码也已经修改完毕,启动前端项目不出意外在刚才的登录地址中输入用户名和密码就可以登录了,点击退出也会退出到cas的登录页面,若是不能退出到cas的登录页面请修改casServer的相关配置使其支持即可。注意,需要在上方引用settings。

以上就是此次CAS集成的相关步骤,总体来说和前后端不分离类似但是稍有不同,此种集成需要CAS登录成功后直接请求后端路径,然后再通过后端路径转发到前端,token之类的都需要在后端通过response去设置,退出登录时之要后台清空后端登录信息,然后返回前端通过调用cas登出的方法去做cas的logout,不然会有跨域的问题,当然若是能解决axios跨域的问题也可以用后台做cas的logout,欢迎留言。

此次项目向使用RuoYi-Vue版本做开发,需要进行单点登录,在做完一次集成后形成了这篇文章,有不足之处望请谅解。因为前后端分离版本和不分离版本有区别集成方式也不太一样,主要区分是在单点登出...
cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成
cas-server-support-jdbc-5.3.14.jar cas-server-support-jdbc-authentication-5.3.14.jar cas-server-support-jdbc-drivers-5.3.14.jar mysql-connector-java-5.1.28.jar
开源协议:MIT 解释:MIT是和BSD一样宽松的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。 (1)若依不分离版本 RuoYi是基于经典技术组合(Spring Boot、ApacheShiro、MyBatis、Thymeleaf)主要目的让开发者...... CAS原理和我们前面自己开发的Nebula基本一致,所有的系统应用都会引导到CAS Server认证中心去登录。登录成功后,认证中心会产生一个票据叫TGT(Ticket Granting Ticket),TGT即代表了用户与认证中心直接的全局会话。TGT存在,表明该用户处于登录状态。 TGT并没有放在Session中,也就是说,CAS全局会话的实现并没有直接使用Session机制
三种配置方法 configure(WebSecurity) 通过重载,配置Spring Security的Filter链 configure(HttpSecurity) 通过重载,配置如何通过拦截器保护请求,用来拦截请求,配置白名单和过滤 configure(AuthenticationManagerBuilder) 通过重载,配置user-detail服务,身份认证接口调用 用户存储方式 auth.inMemoryAuthentication() .withUser(“admin”).passw
### 回答1: Spring Boot CAS 前后端分离是一种常见的架构模式,它将前端和后端分离开来,使得前端和后端可以独立开发、测试和部署。CAS(Central Authentication Service)是一种单点登录系统,它可以实现用户在多个应用系统中的单点登录和注销。在 Spring Boot CAS 前后端分离架构中,前端通过 AJAX 请求后端的 RESTful API 来获取数据,后端则负责处理业务逻辑和数据存储。CAS 服务器则负责用户认证和授权,通过 CAS 协议来实现单点登录和注销。这种架构模式可以提高系统的可维护性、可扩展性和安全性,同时也可以提高开发效率和用户体验。 ### 回答2: Spring Boot是一个流行的Java框架,用于快速创建基于Spring的应用程序。CAS(Central Authentication Service)是一个单点登录协议,允许用户一次登录即可在多个应用程序中访问受保护的资源。Spring BootCAS可以很好地结合使用,以实现前后端分离的应用程序。 前后端分离是指将应用程序的前端和后端分开发展。前端通常由JavaScript、HTML和CSS构建,使用框架如Vue、React或Angular。后端使用Java或其他语言,通常使用Spring Boot等框架开发。在前后端分离的应用程序中,前端通过RESTful API与后端通信,并且通常由单独部署的服务器提供服务。 像CAS这样的单点登录协议可以很好地支持前后端分离的应用程序。在这种情况下,前端负责在CAS服务器上进行身份验证并获得用户凭证。凭证随后使用AJAX请求发送到后端,以获得对受保护资源的访问权限。后端应用程序需要集成CAS客户端库,以验证请求的凭证并授予访问权限。 使用Spring BootCAS实现前后端分离的应用程序有许多优点。首先,这种方法可以提高应用程序的安全性。将身份验证逻辑集中在CAS服务器上可以确保凭证和用户的私人信息得到妥善保护。此外,前后端分离的应用程序通常更易于维护。由于前端和后端分开开发,因此可以使用不同的框架和语言,使得应用程序更具弹性和可扩展性。此外,在前后端分离的应用程序中,可以更轻松地实现可重复使用的代码,从而节省了时间和资源。 总之,Spring BootCAS是实现前后端分离的强大工具。这种方法可以提高应用程序的安全性、可维护性和可扩展性。如果您正在考虑构建一个前后端分离的应用程序,那么使用Spring BootCAS可能是一个很好的选择。 ### 回答3: SpringBoot是一个开箱即用的框架,可以帮开发者快速搭建Web应用程序。而CAS(Central Authentication Service)则是一个认证系统,用户只需要登录一次CAS系统,就可以在各个不同的应用中共享该登录状态。 在前后端分离的架构中,CAS的认证系统可以用于对前后端的用户进行登录认证。在前端页面中,通过用户名和密码登录后,前端会调用CAS的API接口进行登录认证,验证通过后,返回一个Token给前端。前端页面可以使用该Token跨域向后端API发起请求,后端API会通过前端传递的Token进行认证,从而保证API的安全性和可访问性。 在使用SpringBoot构建后端API时,可以使用Spring Security框架集成CAS认证,根据前端传递的Token进行认证。这样,后端API不仅可以保证接口的安全性,还能够避免因为每个应用都需要独立实现登录认证功能而导致的代码冗余。 同时,前后端分离的架构也可以帮助开发者提高开发效率和应用可扩展性。因为前后端可以独立开发、独立部署,开发者可以专注于各自的领域,减少不必要的沟通和协调工作。同时,当应用负载增大时,可以通过扩展前端或后端服务器数量来解决瓶颈,而不用对整个应用进行重构。 总之,前后端分离的架构可以提高开发效率、增强应用可扩展性,而CAS认证系统可以帮助开发者实现安全认证,保障整个应用系统的安全性和可用性。平衡好前后端的工作,使用CAS实现单点登录认证,这对于构建大型Web应用程序非常有帮助。
CSDN-Ada助手: 非常感谢博主的辛勤付出,通过您的博客我学到了如何编译Assimp5.2源码,对我来说是非常有帮助的。这篇博客写得非常清晰明了,容易理解,让我对编译Assimp5.2源码有了全面的了解。希望博主能够继续分享更多的知识,让更多的人受益。再次感谢博主的创作! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 若依前后端分离版本集成CAS Server5.3 qq_27230853: 首先检查一下cas登录地址后面有没有跟登录成功后要跳转的地址,再次可以去CasUserDetailsService 这个里面打个断点,cas登录成功会跳转到这块,若是没有过来证明cas跳转出问题了,若是这2块都没有问题,再去检查若依登录成功后token是否设置到cookie中,前端要获取到token才能继续访问 若依前后端分离版本集成CAS Server5.3 张_先生: 楼主您好,我按照咱们这个出了一个小问题。就是获取不到token ,然后一直重定向登录页面,但是页面路径上已经有tick 那个标识了。这个应该怎么办,还请楼主给点意见 编译Assimp5.2源码 qq_27230853: 是不是没有编译成功啊,检查一下 编译Assimp5.2源码 Jane街灯: 刚试了下5.2.4的也没有这个桌面程序端了,怎么回事啊