栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CAS 5.3.x 单点登录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CAS 5.3.x 单点登录

目录

一:Cas server 搭建

二:证书配置

1:生成证书

2:导出数字证书

3:数字证书导入到JDK中

 4:配置tomcat 

三:添加数据库支持

1:注释掉静态用户名和密码

 2:添加新配置

三:客户端搭建 

 1:搭建个spring boot项目

2:配置Security

3:添加接口

4:未认证授权的服务


最近在网上搜索CAS 单点登录及第三方授权登录的功能,网上一搜一大堆,使用到处都是坑,那么多抄袭的,我也只能苦笑。。。

自己动手丰衣足食,所有还是把自己的正确功能记录一下,给大家做个参考

一:Cas server 搭建

CAS提供了模板 Overlay Template,方便使用 https://github.com/apereo/cas-overlay-template,当前版本是5.3.16,JDK 1.8+

IDEA导入下载的模板,暂时不修改任何熟悉,添加Tomcat

 启动Cas Server,打开http://localhost:8080/cas/login

输入用户名: casuser 密码:Mellon

静态的用户名和密码在application.properties里配置

 因为使用静态的用户和http连接,左侧有提示

黄色内容提示我们没有使用https,本地暂时使用的是http

蓝色内容提示我们使用了静态的用户登录,当然我们会在后面添加数据库支持

二:证书配置

1:生成证书

HTTPS需要证书的支持,所有我们借用JDK提供的工具keytool生成自己使用的证书

keytool -genkey -alias caskeystore -keypass cas123 -keyalg RSA -validity 36500 -keystore D:/Java/keys/cas.keystore

 名字与姓氏时为为具体路由地址,就是待会CAS认证服务器,sso.test.com,时间设置的比较长,36500单位是天

2:导出数字证书

 keytool -export -file D:/Java/keys/cas.crt -alias caskeystore -keystore D:/Java/keys/cas.keystore

 

3:数字证书导入到JDK中

keytool -import -keystore D:/Java/jdk1.8.0_161/jre/lib/security/cacerts -file D:/Java/keys/cas.crt -alias caskeystore -storepass changeit

因为我们没有这个域名,所有将本地的host文件修改下,添加以下

127.0.0.1       sso.test.com

 4:配置tomcat 

在server.xml中

    
        
        
            
        
    

 访问 https://sso.test.com/cas/login

 

已经可以正常访问了。 

三:添加数据库支持

1:注释掉静态用户名和密码
#cas.authn.accept.users=casuser::Mellon

 2:添加新配置
#以下为本地的数据库配置信息
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/user?serverTimezone=UTC&allowMultiQueries=true
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=123456
cas.authn.jdbc.query[0].sql=select password from data_user where user_name = ?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
#指定过期字段,1为过期,若过期不可用(可选)
#cas.authn.jdbc.query[0].fieldExpired=expired
#为不可用字段段,1为不可用,需要修改密码(可选)
#cas.authn.jdbc.query[0].fieldDisabled=disabled

3:在pom.xml中添加配置


    org.apereo.cas
    cas-server-support-jdbc
    ${cas.version}


    mysql
    mysql-connector-java
    8.0.18

 

mysql版本根数据库版本一致就行 

建表语句

CREATE TABLE DATA_USER(
    ID VARCHAr(32)    COMMENT '编号' ,
    USER_NAME VARCHAr(60)    COMMENT '用户名' ,
    PASSWORD VARCHAr(60)    COMMENT '密码' ,
    CREATED_BY VARCHAr(32)    COMMENT '创建人' ,
    CREATED_TIME DATETIME   DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
    UPDATeD_BY VARCHAr(32)    COMMENT '更新人' ,
    UPDATED_TIME DATETIME   DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间' 
)  COMMENT = '用户表';

三:客户端搭建 

 1:搭建个spring boot项目

 

以下是pom.xml



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.5
         
    
    com.example
    client1
    0.0.1-SNAPSHOT
    client1
    client1
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter-security
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.security
            spring-security-test
            test
        
        
        
            org.springframework.security
            spring-security-cas
            5.5.2
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    


 新建application.yml

cas:
    server:
        host: https://sso.test.com/cas
        login: ${cas.server.host}/login
        logout: ${cas.server.host}/logout
app:
    server:
        host: http://localhost:${server.port}${server.servlet.context-path}
        login: /login/cas
        logout: /logout

server:
#    address: 127.0.0.1
    port: 9998
    servlet:
        context-path: /client1

# 为了方便调试可以打开
#logging.level.org.springframework.security: debug
#logging.level.web: debug

2:配置Security

添加SecurityConfig

@Configuration
@EnableWebSecurity //启用web权限
@EnableGlobalMethodSecurity(prePostEnabled = true) //启用方法验证
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String CAS_AUTHENTICATION_PROVIDER_KEY = "casAuthenticationProviderKey";

    @Autowired
    private CasProperties casProperties;

    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //禁用csrf保护机制
        http.csrf().disable();
        //禁用cors保护机制
        http.cors().disable();
        //禁用form表单登录
        http.formLogin().disable();
        //增加自定义过滤器

        http.authorizeRequests()//配置安全策略
//                .antMatchers("
    //即跳转至服务端的cas地址
    @Bean
    public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
        CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
        casAuthenticationEntryPoint.setLoginUrl(casProperties.getCasServerLogin());
        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
        return casAuthenticationEntryPoint;
    }


    // 设置客户端service的属性
    @Bean
    public ServiceProperties serviceProperties() {
        ServiceProperties serviceProperties = new ServiceProperties();
        // 设置回调的service路径,此为主页路径
        // Cas Server认证成功后的跳转地址,这里要跳转到我们的Spring Security应用,
        // service 配置自身工程的根地址+/login/cas,表示是通过自身工程跳转到cas的登录页面,/login/cas 这个是security集成cas的固定写法
        serviceProperties.setService(casProperties.getAppServerHost() + casProperties.getAppServerLogin());
        // 对所有的未拥有ticket的访问均需要验证
        serviceProperties.setAuthenticateAllArtifacts(true);
        // sendRenew默认是false,true则意味着不允许单点登录,用户需要重新输入用户名密码以验证
        // 在安全级别要求比较高的情况下可以使用
        // serviceProperties.setSendRenew(false);
        return serviceProperties;
    }
    

    
    @Bean
    public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
        CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
        casAuthenticationFilter.setAuthenticationManager(authenticationManager());
        casAuthenticationFilter.setFilterProcessesUrl(casProperties.getAppServerLogin());
        return casAuthenticationFilter;
    }

    
    @Bean
    public CasAuthenticationProvider casAuthenticationProvider() {
        CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
        casAuthenticationProvider.setAuthenticationUserDetailsService(customUserDetailsService());
        casAuthenticationProvider.setServiceProperties(serviceProperties());
        casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator());
        casAuthenticationProvider.setKey(CAS_AUTHENTICATION_PROVIDER_KEY);
        return casAuthenticationProvider;
    }

    
    @Bean
    public AuthenticationUserDetailsService customUserDetailsService() {
        return new CustomUserDetailsService();
    }

    
    @Bean
    public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
        // 配置上服务端的校验ticket地址
        return new Cas20ServiceTicketValidator(casProperties.getCasServerHost());
    }

    

    
    
    @Bean
    public LogoutFilter casLogoutFilter() {
        LogoutFilter logoutFilter =
                new LogoutFilter(casProperties.getCasServerLogout(), new SecurityContextLogoutHandler());
        logoutFilter.setFilterProcessesUrl(casProperties.getAppServerLogout());
        return logoutFilter;
    }

    @Bean
    public SingleSignOutFilter singleSignOutFilter() {
        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
        singleSignOutFilter.setIgnoreInitConfiguration(true);
        return singleSignOutFilter;
    }
    
}

配置读取文件CasProperties

@Component
@Data
public class CasProperties {
    @Value("${cas.server.host}")
    private String casServerHost;
    @Value("${cas.server.login}")
    private String casServerLogin;
    @Value("${cas.server.logout}")
    private String casServerLogout;
    @Value("${app.server.host}")
    private String appServerHost;
    @Value("${app.server.login}")
    private String appServerLogin;
    @Value("${app.server.logout}")
    private String appServerLogout;
}

自定义授权CustomUserDetailsService

public class CustomUserDetailsService implements AuthenticationUserDetailsService {
    
    @Override
    public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
        System.out.println("人员信息");
        List authorities = new ArrayList();
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
        return new User(token.getName(), "", authorities);
    }
}

3:添加接口
@RestController
@AllArgsConstructor
@RequestMapping("/common")
public class Common {

    @GetMapping( "/test")
    public String test() {
        return "客户端1";
    }
}

client2和client1配置基本相同,自己操作即可

启动clien项目,分别访问http://localhost:9998/client1/common/test和http://localhost:9999/client2/common/test

发现以下错误

4:未认证授权的服务

出现以上问题是因为Cas Server未开启http协议

在服务端的WEB-INF/classess/application.properties添加以下内容

#设置安全为false
cas.tgc.secure=false
#开启识别json文件,默认false
cas.serviceRegistry.initFromJson=true

# 配置允许登出后跳转到指定页面
cas.logout.followServiceRedirects=true
# 跳转到指定页面需要的参数名为 service
cas.logout.redirectParameter=service

同样修改WEB-INFclassesservicesHTTPSandIMAPS-10000001.json,在serviceId的属性中添加http后重启服务端即可

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(https|http|imaps)://.*",
  "name" : "HTTPS and IMAPS",
  "id" : 10000001,
  "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  "evaluationOrder" : 10000
}

现在重新打开http://localhost:9998/client1/common/test

 输入用户名和密码,登录

访问 http://localhost:9999/client2/common/test,直接显示内容

单点登录到这里就完成了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322290.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号