精华内容
下载资源
问答
  • OAuth2.0 原理流程及其单点登录权限控制

    万次阅读 多人点赞 2018-07-26 07:21:58
    单点登录域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。 作者:王克锋 出处:...

    单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。

    作者:王克锋
    出处:https://kefeng.wang/2018/04/06/oauth2-sso/
    版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

    1 什么是单点登录

    1.1 多点登录

    传统的多点登录系统中,每个站点都实现了本站专用的帐号数据库和登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录。如下图,有两个术语含义如下:

    • 认证(authentication): 验证用户的身份;
    • 授权(authorization): 验证用户的访问权限。

    1.2 单点登录

    单点登录,英文是 Single Sign On,缩写为 SSO。
    多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。

    2 OAuth2 认证授权的原理流程

    2.1 生活实例【★★重点★★】

    为了直观的理解 OAuth2.0 原理流程,我们假设这样一个生活场景:
    (1)档案局A(客户端 / Client):以“档案局ID/密码”标识,是掌握档案资源的机构。并列还有很多档案局B/C/…,每个档案局存储的档案内容(资源 / Resource)不一样,比如政治、经济、军事、文化等;
    (2)公民张三(资源所有者 / Resource Owner):以“用户名/密码”标识,需要到各个档案局查档案;
    (3)派出所(授权服务器 / Authentication Server):可以是单个巨大的派出所,也可以是数据共享的派出所集群,掌管的信息、提供的对外接口功能有:

    • 档案局信息:所有档案局的“档案局ID/密码”,证明档案局的身份;
    • 公民信息:所有公民的“用户名/密码”,能提供张三是张三的用户身份证明(认证 / Authentication)
    • 公民对于档案局的权限:有张公民和档案局的权限的映射表,可查得各公民对各档案局是否有操作权限(授权 / Authorization)。通常,设计中会增加官职(角色 / Role)一层,各公民属于哪个官职(角色),哪个官职(角色)对于特定档案局有操作权限。

    2.1.1 张三首次访问档案局A

    张三之前从未到访档案局,第一次来档案局。对照下图序号理解:
    (1)张三来到“档案局A”的“档案处”,该处要求实名登记后才能查询,被指示到“用户登记处”办理(HTTP重定向);
    (2)张三来到“档案局A”的“用户登记处”,既不能证明身份(认证),又不能证明自己有查档案A的权限(授权)。张三携带档案局A的标识(client-id),被重定向至“授权信开具处”;
    (3)张三来到“派出所”的“授权信开具处”,出示档案局A的标识,希望开具授权信(授权)。该处要求首先证明身份(认证),被重定向至“用户身份验证处”;
    (4)张三来到“派出所”的“用户身份验证处”,领取了用户身份表(网页登录表单 Form);
    (5)张三填上自己的用户名和密码,交给(提交 / Submit)“用户身份验证处”,该处从私用数据库中查得用户名密码匹配,确定此人是张三,开具身份证明信,完成认证。张三带上身份证明信和档案局A的标识,被重定向至“授权信开具处”;
    (6)张三再次来到“授权信开具处”,出示身份证明信和档案局A的标识,该处从私用数据库中查得,张三的官职是市长级别(角色),该官职具有档案局A的查询权限,就开具“允许张三查询档案局A”的授权信(授权码 / code),张三带上授权信被重定向至“档案局”的“用户登录处”;
    (7)张三到了“档案局”的“用户登录处”,该处私下拿出档案局A的标识(client-id)和密码,再附上张三出示的授权信(code),向“派出所”的“腰牌发放处”为张三申请的“腰牌”(token),将来张三可以带着这个腰牌表明身份和权限。又被重定向到“档案处”;
    (8)张三的会话(Session)已经关联上了腰牌(token),可以直接通过“档案处”查档案。

    2.1.2 张三首次访问档案局B

    张三已经成功访问了档案局A,现在他要访问档案局B。对照下图序号理解:
    (1)/(2) 同上;
    (3)张三已经有“身份证明信”,直接在“派出所”的“授权信开具处”成功开具“访问档案局B”的授权信;
    (4)/(5)/(6) 免了;
    (7)“档案局B”的“用户登记处”完成登记;
    (8)“档案局B”的“档案处”查得档案。

    2.1.3 张三再次访问档案局A

    张三已经成功访问了档案局A,现在他要访问档案局A。对照下图序号理解:
    (1)直接成功查到了档案;
    (2~8)都免了。

    2.2 HTTP 重定向原理

    HTTP 协议中,浏览器的 REQUEST 发给服务器之后,服务器如果发现该业务不属于自己管辖,会把你支派到自身服务器或其他服务器(host)的某个接口(uri)。正如我们去政府部门办事,每到一个窗口,工作人员会说“你带上材料A,到本所的X窗口,或者其他Y所的Z窗口”进行下一个手续。

    2.3 SSO 工作流程

    至此,就不难理解 OAuth 2.0 的认证/授权流程,此处不再赘述。请拿下图对照“2.1 生活实例”一节来理解。

    2.4 OAuth2.0 进阶

    根据官方标准,OAuth 2.0 共用四种授权模式:

    • Authorization Code: 用在服务端应用之间,这种最复杂,也是本文采用的模式;
    • Implicit: 用在移动app或者web app(这些app是在用户的设备上的,如在手机上调起微信来进行认证授权)
    • Resource Owner Password Credentials(password): 应用直接都是受信任的(都是由一家公司开发的,本例子使用)
    • Client Credentials: 用在应用API访问。

    3 基于 SpringBoot 实现认证/授权

    官方文档:Spring Cloud Security

    3.1 授权服务器(Authorization Server)

    (1) pom.xml

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>

    (2) application.properties

    server.port=8110 ## 监听端口

    (3) AuthorizationServerApplication.java

    @EnableResourceServer // 启用资源服务器
    public class AuthorizationServerApplication {
        // ...
    }

    (4) 配置授权服务的参数

    @Configuration
    @EnableAuthorizationServer
    public class Oauth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
        @Override
        public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
            clients.inMemory()
                    .withClient("webapp").secret("secret") //客户端 id/secret
                    .authorizedGrantTypes("authorization code") //授权妈模式
                    .scopes("user_info")
                    .autoApprove(true) //自动审批
                    .accessTokenValiditySeconds(3600); //有效期1hour
        }
    }
    
    @Configuration
    public class Oauth2WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.requestMatchers()
                    .antMatchers("/login", "/oauth/authorize/oauth/logout")
                    .and().authorizeRequests().anyRequest().authenticated()
                    .and().formLogin().permitAll();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN");
        }
    }

    3.2 客户端(Client, 业务网站)

    (1) pom.xml

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>

    (2) application.properties

    server port=8080
    security.oauth2.client.client-id=webapp
    security.oauth2.client.client-secret=secret
    security.oauth2.client.access-token-uri=http://localhost:8110/oauth/token
    security.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorize
    security.oauth2.resource.user-info-uri=http://localhost:8110/oauth/user

    (3) 配置 WEB 安全

    @Configuration
    @EnableOAuth2Sso
    public class Oauth2WebsecurityConfigurer extends WebSecurityConfigurerAdapter {
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.antMatcher("/**").authorizeRequests()
                    .antMatchers("/", "/login").permitAll()
                    .anyRequest().authenticated();
        }
    }
    
    @RestController
    public class Oauth2ClientController {
        @GetMapping("/")
        public ModelAndView index() {
            return new ModelAndView("index");
        }
    
        @GetMapping("/welcome")
        public ModelAndView welcome() {
            return new ModelAndView("welcome");
        }
    }

    3.3 用户权限控制(基于角色)

    • 授权服务器中,定义各用户拥有的角色: user=USER, admin=ADMIN/USER, root=ROOT/ADMIN/USER
    • 业务网站中(client),注解标明哪些角色可
    @RestController
    public class Oauth2ClientController {
        @GetMapping("/welcome")
        public ModelAndView welcome() {
            return new ModelAndView("welcome");
        }
    
        @GetMapping("/api/user")
        @PreAuthorize("hasAuthority('USER')")
        public Map<String, Object> apiUser() {
        }
    
        @GetMapping("/api/admin")
        @PreAuthorize("hasAuthority('ADMIN')")
        public Map<String, Object> apiAdmin() {
        }
    
        @GetMapping("/api/root")
        @PreAuthorize("hasAuthority('ROOT')")
        public Map<String, Object> apiRoot() {
        }
    }

    4 综合运用

    4.1 权限控制方案

    下图是基本的认证/授权控制方案,主要设计了认证授权服务器上相关数据表的基本定义。可对照本文“2.1 生活实例”一节来理解。

    4.2 在微服务架构中的应用

    与常规服务架构不同,在微服务架构中,Authorization Server/Resource Server 是作为微服务存在的,用户的登录可以通过API网关一次性完成,无需与无法跳转至内网的 Authorization Server 来完成。

    展开全文
  • 这种需求的系统谁做过 之前 参考了 网上博客的 oauth2 但是发现不太符合我这个需求 因为oauth2只是授权 并不能解决 ...但是 总感觉 这需要单点登录 结合session共享 和shiro权限 这几个技术 最好有demo 谢谢了
  • JWT的权限系统设计》之中已经讨论过基于 Spring Security和 JWT的权限系统用法和实践,本文则进一步实践一下基于 Spring Security Oauth2实现的多系统单点登录(SSO)和 JWT权限控制功能,毕竟这个需求也还是蛮普遍...

    Profile


    概 述

    在前文《基于Spring Security和 JWT的权限系统设计》之中已经讨论过基于 Spring SecurityJWT的权限系统用法和实践,本文则进一步实践一下基于 Spring Security Oauth2实现的多系统单点登录(SSO)和 JWT权限控制功能,毕竟这个需求也还是蛮普遍的。

    代码已开源,放在文尾,需要自取


    理论知识

    在此之前需要学习和了解一些前置知识包括:

    • Spring Security:基于 Spring实现的 Web系统的认证和权限模块
    • OAuth2:一个关于授权(authorization)的开放网络标准
    • 单点登录 (SSO):在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
    • JWT:在网络应用间传递信息的一种基于 JSON的开放标准((RFC 7519),用于作为JSON对象在不同系统之间进行安全地信息传输。主要使用场景一般是用来在 身份提供者和服务提供者间传递被认证的用户身份信息

    要完成的目标

    • 目标1:设计并实现一个第三方授权中心服务(Server),用于完成用户登录,认证和权限处理
    • 目标2:可以在授权中心下挂载任意多个客户端应用(Client
    • 目标3:当用户访问客户端应用的安全页面时,会重定向到授权中心进行身份验证,认证完成后方可访问客户端应用的服务,且多个客户端应用只需要登录一次即可(谓之 “单点登录 SSO”)

    基于此目标驱动,本文设计三个独立服务,分别是:

    • 一个授权服务中心(codesheep-server
    • 客户端应用1(codesheep-client1
    • 客户端应用2(codesheep-client2

    多模块(Multi-Module)项目搭建

    三个应用通过一个多模块的 Maven项目进行组织,其中项目父 pom中需要加入相关依赖如下:

    <dependencies>
    
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-dependencies</artifactId>
    		<version>2.0.8.RELEASE</version>
    		<type>pom</type>
    		<scope>import</scope>
    	</dependency>
    
    	<dependency>
    		<groupId>io.spring.platform</groupId>
    		<artifactId>platform-bom</artifactId>
    		<version>Cairo-RELEASE</version>
    		<type>pom</type>
    		<scope>import</scope>
    	</dependency>
    
    	<dependency>
    		<groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-dependencies</artifactId>
    		<version>Finchley.SR2</version>
    		<type>pom</type>
    		<scope>import</scope>
    	</dependency>
    
    </dependencies>
    

    项目结构如下:

    项目结构


    授权认证中心搭建

    授权认证中心本质就是一个 Spring Boot应用,因此需要完成几个大步骤:

    • pom中添加依赖
    <dependencies>
    	<dependency>
    		<groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-starter-oauth2</artifactId>
    	</dependency>
    </dependencies>
    
    • 项目 yml配置文件:
    server:
      port: 8085
      servlet:
        context-path: /uac
    

    即让授权中心服务启动在本地的 8085端口之上

    • 创建一个带指定权限的模拟用户
    @Component
    public class SheepUserDetailsService implements UserDetailsService {
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Override
        public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
    
            if( !"codesheep".equals(s) )
                throw new UsernameNotFoundException("用户" + s + "不存在" );
    
            return new User( s, passwordEncoder.encode("123456"), AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_NORMAL,ROLE_MEDIUM"));
        }
    }
    

    这里创建了一个用户名为codesheep,密码 123456的模拟用户,并且赋予了 普通权限ROLE_NORMAL)和 中等权限ROLE_MEDIUM

    • 认证服务器配置 AuthorizationServerConfig
    @Configuration
    @EnableAuthorizationServer
    public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    
            // 定义了两个客户端应用的通行证
            clients.inMemory()
                    .withClient("sheep1")
                    .secret(new BCryptPasswordEncoder().encode("123456"))
                    .authorizedGrantTypes("authorization_code", "refresh_token")
                    .scopes("all")
                    .autoApprove(false)
                    .and()
                    .withClient("sheep2")
                    .secret(new BCryptPasswordEncoder().encode("123456"))
                    .authorizedGrantTypes("authorization_code", "refresh_token")
                    .scopes("all")
                    .autoApprove(false);
        }
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    
            endpoints.tokenStore(jwtTokenStore()).accessTokenConverter(jwtAccessTokenConverter());
            DefaultTokenServices tokenServices = (DefaultTokenServices) endpoints.getDefaultAuthorizationServerTokenServices();
            tokenServices.setTokenStore(endpoints.getTokenStore());
            tokenServices.setSupportRefreshToken(true);
            tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
            tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
            tokenServices.setAccessTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(1)); // 一天有效期
            endpoints.tokenServices(tokenServices);
        }
    
        @Override
        public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
            security.tokenKeyAccess("isAuthenticated()");
        }
    
        @Bean
        public TokenStore jwtTokenStore() {
            return new JwtTokenStore(jwtAccessTokenConverter());
        }
    
        @Bean
        public JwtAccessTokenConverter jwtAccessTokenConverter(){
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            converter.setSigningKey("testKey");
            return converter;
        }
    
    }
    

    这里做的最重要的两件事:一是 定义了两个客户端应用的通行证(sheep1sheep2);二是 配置 token的具体实现方式为 JWT Token

    • Spring Security安全配置 SpringSecurityConfig
    @Configuration
    public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        @Bean
        public AuthenticationManager authenticationManager() throws Exception {
            return super.authenticationManager();
        }
    
        @Autowired
        private UserDetailsService userDetailsService;
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        @Bean
        public DaoAuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(userDetailsService);
            authenticationProvider.setPasswordEncoder(passwordEncoder());
            authenticationProvider.setHideUserNotFoundExceptions(false);
            return authenticationProvider;
        }
        
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            http
                    .requestMatchers().antMatchers("/oauth/**","/login/**","/logout/**")
                    .and()
                    .authorizeRequests()
                    .antMatchers("/oauth/**").authenticated()
                    .and()
                    .formLogin().permitAll();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(authenticationProvider());
        }
    
    }
    

    客户端应用创建和配置

    本文创建两个客户端应用:codesheep-client1codesheep-client2,由于两者类似,因此只以其一为例进行讲解

    • SSO客户端应用配置类 ClientWebsecurityConfigurer
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @EnableOAuth2Sso
    public class ClientWebsecurityConfigurer extends WebSecurityConfigurerAdapter {
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.antMatcher("/**").authorizeRequests()
                    .anyRequest().authenticated();
        }
    }
    

    复杂的东西都交给注解了!

    • application.yml配置
    auth-server: http://localhost:8085/uac
    server:
      port: 8086
    
    security:
      oauth2:
        client:
          client-id: sheep1
          client-secret: 123456
          user-authorization-uri: ${auth-server}/oauth/authorize
          access-token-uri: ${auth-server}/oauth/token
        resource:
          jwt:
            key-uri: ${auth-server}/oauth/token_key
    

    这里几项配置都非常重要,都是需要和前面搭建的授权中心进行通信的

    • 创建测试控制器 TestController
    @RestController
    public class TestController {
    
        @GetMapping("/normal")
        @PreAuthorize("hasAuthority('ROLE_NORMAL')")
        public String normal( ) {
            return "normal permission test success !!!";
        }
    
        @GetMapping("/medium")
        @PreAuthorize("hasAuthority('ROLE_MEDIUM')")
        public String medium() {
            return "medium permission test success !!!";
        }
    
        @GetMapping("/admin")
        @PreAuthorize("hasAuthority('ROLE_ADMIN')")
        public String admin() {
            return "admin permission test success !!!";
        }
    }
    

    此测试控制器包含三个接口,分别需要三种权限(ROLE_NORMALROLE_MEDIUMROLE_ADMIN),待会后文会一一测试看效果


    实验验证

    • 启动授权认证中心 codesheep-server(启动于本地8085端口)
    • 启动客户端应用 codesheep-client1 (启动于本地8086端口)
    • 启动客户端应用 codesheep-client2 (启动于本地8087端口)

    首先用浏览器访问客户端1 (codesheep-client1) 的测试接口:localhost:8086/normal,由于此时并没有过用户登录认证,因此会自动跳转到授权中心的登录认证页面:http://localhost:8085/uac/login

    自动跳转到授权中心统一登录页面

    输入用户名 codesheep,密码 123456,即可登录认证,并进入授权页面:

    授权页面

    同意授权后,会自动返回之前客户端的测试接口:

    自动返回客户端接口并调用成功

    此时我们再继续访问客户端1 (codesheep-client1) 的测试接口:localhost:8086/medium,发现已经直接可以调用而无需认证了:

    直接访问

    由于 localhost:8086/normallocalhost:8086/medium要求的接口权限,用户codesheep均具备,所以能顺利访问,接下来再访问一下更高权限的接口:localhost:8086/admin

    无权限访问

    好了,访问客户端1 (codesheep-client1) 的测试接口到此为止,接下来访问外挂的客户端2 (codesheep-client2) 的测试接口:localhost:8087/normal,会发现此时会自动跳到授权页:

    由于用户已通过客户端1登录过_因此再访问客户端2即无需登录_而是直接跳到授权页

    授权完成之后就可以顺利访问客户端2 (codesheep-client2) 的接口:

    顺利访问客户端2的接口

    这就验证了单点登录SSO的功能了!


    未完待续

    受篇幅所限,本文应该说实践了一下精简流程的:SSO单点登录和JWT权限控制,还有很多可以复杂和具化的东西可以实现,比如:

    • 客户端 client凭据 和 用户 user的凭据可以用数据库进行统一管理
    • 认证 token也可以用数据库或缓存进行统一管理
    • 授权认证中心的统一登录页面可以自定义成需要的样子
    • 认证中心的授权页也可以自定义,甚至可以去掉
    • 包括一些异常提示也可以自定义

    总之,尽情地折腾去吧!

    本文开源代码地址在此:Spring-Boot-In-Action,需要自取


    写在最后

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    展开全文
  • SSO 单点登录系统 +源码 +部署文档+架构图+权限管,包含项目数据库
  • 前言 目前在做门户,有很不明白的地方,经过思考和讨论,大致梳理出了...每个系统都维护一份用户表,和单点登录的用户表保持同步,然后每个系统使用自己的用户表来维护用户和权限,角色,组织机构等的关系。 这种方.

     前言

    目前在做门户,有很多不明白的地方,经过思考和讨论,大致梳理出了一个基本的思路。

    2. 单点登录

    单点登录用于多个系统之间的统一认证,做到“登陆一次,随意通行”。单点登录和门户没有必然联系,单点登录组件比如CAS只管认证,不管其他的。

    问题:若干个系统只用一份用户表,那么每个系统里面没有维护用户信息,怎么去维护各自系统的权限,角色,组织机构等关系呢?

    方案一

    每个系统都维护一份用户表,和单点登录的用户表保持同步,然后每个系统使用自己的用户表来维护用户和权限,角色,组织机构等的关系。
    这种方式的关键在于用什么手段保持同步:

    • 在数据库层面同步用户信息
      可以在单点登录用户表中创建触发器,在添加、修改、删除的时候同时编辑各个子系统的用户表还有其他的用户关联信息。
      这种办法简单好用,但是要求各个系统的数据库在同一台机器上或者可以提供DBLink之类的连接,缺点是不利于扩展,比如子系统更换了数据库类型就歇菜了。
    • 在应用层面同步用户信息
      各个系统提供维护用户信息的WebService接口或者API,在维护单点登录用户的时候调用各子系统的接口实现系统间的同步
      这种方式的缺点是:
      • 将同步的操作写在代码中,可能会经常改动代码。
      • 可能会因为接口服务宕掉或者其他原因并不能保证各系统之间数据的完全一致,最后还是需要人工参与。

    方案二

    抽离出公共的权限模块,用来统一管理用户、角色、权限、机构等信息。
    这个就有点类似于门户的功能了,把这些资源都抽离成一个父模块统一管理,各个子系统不需要维护这些关系,自然也就不需要同步了。
    父模块需要提供方案供各个子模块获取权限、角色、机构等信息。

    3. 门户

    门户的概念可大可小,基本包含如下几点:

    • 单点登录
    • 统一权限管理
    • 日志管理
    • 各系统功能的整合

    3.1. 单点登录

    门户提供单点登录功能。

    3.2. 统一权限管理

    问题一:门户既然统一管理权限,各个子系统怎么获取自己需要的权限信息呢?

    方案一:

    门户提供Webservice查询接口供各个子系统调用。
    这种方式性能不太好。

    方案二:

    门户提供API(jar包)查询接口供各个子系统调用。
    这种方式不错,提供Maven依赖也可以比较方便的更新。

    方案三:

    使用Redis保存用户信息和权限信息,各个子系统和门户都从Redis里面取信息,从而做到Session信息共享。
    这种方式适合多系统之间Session共享,需要单独的Redis服务器。

    问题二:子系统中有一些资源需要授权,但是这些资源门户中很难维护怎么办?

    有些数据量很大(比如数据库的元数据信息);有些资源变动特别频繁(比如文件资源);有些资源权限控制复杂(比如需要控制访问范围、读写权限,类似于LInux文件);甚至有一些资源是需要动态获取的,根本无法固化到数据库中。
    以上这些资源是很难再门户中维护的。

    方案一

    子系统同步门户的用户、部门等表,具体办法参考上文。

    方案二

    门户提供用户列表、部门列表等信息的查询接口或者API供子系统调用,子系统授权的时候从接口或者API中获取这些信息,然后用来授权建立关联信息。这种方式只是理论上可行,但是肯定非常复杂繁琐。
    缺点:

    • 开发很困难
    • 不安全
    • 权限管理复杂,有些用户有只A系统的权限,没有B系统的权限,那么用户A需要只能获取到有本系统权限的用户。

    3.3. 日志管理

    日志分为两种:访问日志和操作日志。

    3.3.1. 访问日志

    • 如果访问的是门户中的资源,那么门户直接记录访问日志。
    • 如果访问的是子系统中的资源,需要子系统调用门户提供的访问日志接口或者API来记录访问日志。

    3.3.2. 操作日志

    • 如果是门户本身的操作,比如用户信息的维护,资源的注册和删除等,这些操作日志由门户直接记录。
    • 其他设计具体子系统业务的操作,由子系统调用门户提供的接口或者API记录操作日志。

    3.4. 各系统功能整合

    门户整合子系统根据实际情况有很多种方式。

    • 完全整合
      完全控制子系统的各种资源的管理和授权,甚至可以将子系统的功能嵌入到门户中。
    • 控制权限、提供单点登录
      完全控制子系统的各种资源的管理和授权,提供单点登录功能,以门户作为入口访问各个子系统。
    • 只提供单点登录
      只提供单点登录,子系统同步用户机构等表,自己控制权限。
    • 仅整合入口
      仅整合入口,伪单点登录。

    问题一:子系统不想改造,只想简单嵌入到门户中怎么办?

    实际工作中因为门户需要整合其他系统,可能会遇到各种各种的问题或者阻力,比如已经上线运行的系统要整合到门户中,进行单点登录、权限等改造是很耗费时间的,尤其是客户不掏钱的情况下厂商是肯定不想改的。
    这种情况可以做一种伪单点登录,子系统基本不用怎么改动即可。
    解决方案:
    1. 这种情况门户中只能维护一个子系统的入口,其他的权限、用户等等都不用管,用户点击入口链接时,门户打开新窗口调用子系统的登录页面,将用户名密码等信息传过去。
    2. 子系统的逻辑也基本不用修改,判断用户名密码是否正确就可以,出于安全考虑链接和请求信息一般会加密,所以子系统一般需要对信息进行解密在校验。
    3. 子系统的用户表需要从门户的用户表中同步,注意只需要同步有登陆该系统权限的用户。
    4. 子系统开发一个没有访问权限的页面,如果登录验证失败,就返回这个无权限页面。

    问题二:关于原本使用Shiro控制权限的系统如何作为子系统接入门户?

    Shiro原本控制权限使用的是一个唯一的字符串也就是权限标识来控制用户的权限的,这个字符串一般是唯一的,可读性好的,有一定业务含义的。
    但是门户控制权限不大可能为使用Shiro的子系统去维护这样的字符串。
    所以子系统可以维护一个资源ID和权限标识的映射关系表,获取到拥有权限的资源ID集合以后再映射成权限标识的集合提供给Shiro。
    注意:
    其实不只是Shiro,各个子系统都可能存在这个问题,就是门户的资源ID和系统的资源ID是不一致的,都可以用这种思路解决。

    4. 声明

    我对这方面的理解实在有限,本文说的也肯定有不全面或者不对的地方,也许有更好的方案,希望有大神看到指点一二,谢谢!

    展开全文
  • 最近在弄单点登录权限管理系统,要求

           最近在弄单点登录和权限管理系统相结合,放入到自己的系统中。单点登录采用CAS框架,而权限管理,据所知对于权限管理的开源框架也很多,不过公司自己写的权限管理框架,为了让其他的系统能很好的和这个权限管理系统对接,权限管理只是针对其他系统的菜单和按钮进行控制,通过控制其他系统菜单和点击菜单下的按钮隐藏和显示来控制权限,缺点是针对具体的某个系统从功能上的某些方面控制权限是十分的困难的。

           如何让系统对接上CAS和权限管理系统呢?

           在这里使用的是Filter进行过滤控制,就像进入家门需要几道门,大门的门禁,二门的门禁,然后是自己家的门。所以这第一道门就是CAS,如果用户没有登录权限就别说其他的权限了,所以第一个filter是针对CAS的,包括CAS 登录系统,CAS登出系统,CAS票据验证;第二个Filter是权限管理系统的filter,通过这个fiter,查看用户是否有url来判断用户有怎样的权限,是不存在的用户,还是只读用户,还是可读可写用户。

           那具体的实现流程?

           对于CAS就不再赘述了,网上有很多这样的文章,笔者也实现了CAS单点登录,可以修改CAS的登录页面,也定制了自己的登录登出页面,有些不足之处需要改正。对于CAS能跟着文档进行操作,但是形成思想写下来,行文流水还是有些困难,在后续的研究中会继续写CAS的博文。

           对权限管理系统和其他系统对接?

           大脑内存小,想了想也难以能一下子说出来,就画了这样一张图,算是最原始的涂鸦吧。



           1 首先是系统要使用权限管理系统,需要在权限系统中录入该系统的标识,如testSystem2.0;之后建立系统角色,建立角色时可选择角色属于哪个系统,在选择属于哪个系统的时候,可以选择该系统下的所有的菜单和按钮;角色建立完毕,便可以建立用户组,一个用户组可以选择一个系统, 同时可以选择属于这个系统的哪个角色;新建用户,那么这个用户只能属于某一个系统的其中的一个角色, 不能选择同时一个系统的多个角色。

           2 登录vms的时候,用户名和密码在cas上进行验证,验证输入的用户名和密码是否正确,也就是第一个filter过滤。

           3 验证用户名密码成功后, 进行第二个filter过滤,根据用户名和系统标识可以在权限管理系统中找到,权限管理系统会返回一个json串给vms。vms取得后解析json成为html格式的,显示在左侧的菜单栏。对于buttons来说vms存放到自己的session中一份,vms中定义 一个a标签的的隐藏格式, 取得buttons的url, 再取得所有的button对象,和url中对比,存在的则显示,不存在的则隐藏该按钮对象。

           4 对于权限的filter,如果用户通过输入url访问,他不能访问到的地址,会返回一个错误的没有权限的友好提示。


    注:本篇博客仅仅是顺顺自己的思路,勿喷~



    展开全文
  • 单点登录(十八)----cas4.2.x客户端增加权限控制shiro

    万次阅读 热门讨论 2017-02-16 22:29:44
    单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程也完成了获取管理员身份属性单点登录(十七)----cas4.2.x登录mongodb验证方式成功后返回更信息更属性到客户端现在需要做的就是给客户端 cas...
  • 办法:使用单点登录,每个服务需要进入时跳转到sso完成登录,在zuul反向代理回需要进入的服务,用户数据保留进redis ,cookie保留redis的key , 回到服务里面再进行shiro的认证(每个服务都已经单独部署了shiro) ...
  • 单点登录能够确保:必须通过身份验证后,才能访问网站,且访问系统时,只需要登录一次。 该系列的完整写作计划,可见:系列概述 一般系统都会有个角色,不同角色可访问的系统功能不同,通过给用户分配不同...
  • 这个认证中心实现在多系统应用构成的集群中,登录其中任意一个系统,其它系统自动得到授权,从而无需再次登录,从而实现了单点登录单点注销两部分。 认证中心是一个独立的应用,即微服务,只有它能接受用户名...
  • 单点登录系统原理与接入

    万次阅读 多人点赞 2018-03-12 16:15:18
    以下是个人查询资料的借鉴及对接某大型互联网公司单点系统后的一个总结和理解一、首先了解下单系统登录机制1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协...
  • 通用权限管理系统-Bootstrap框架/JasigCAS单点登录/Dubbo接口授权: 已经放到GitHub,请参阅这里:https://github.com/pumadong/cl-privilege 这已经是第三个版本,放弃了Thrift这个通讯框架,改用Dubbo;对于界面,...
  • 其核心目标是实现公司内部各个系统权限的集中管理,利用cas单点登录实现系统的一站式登录特点 单点登录 权限集中管理,提供权限管理中心 集成第三方登录,与现有账号绑定,方便快捷 利用shiro实现权限管理,灵活...
  • 基于Windows AD的单点登录系统

    千次阅读 2018-10-08 21:53:07
    随着公司信息化建设的发展,部署的应用系统也越来越。 首先,从用户角度:用户会觉得自己身陷于越来越的用户账号和密码需要记录,以便于使用各种程序。每个新的系统有不同的密码规则,对密码的长度、有效期、...
  • 总结: Oauth2包括授权服务器,资源服务器,客户端(即各个应用系统)这三角色,其实Oauth2只完成认证的工作,至于权限控制还得通过Spring security或者自定义拦截器来做。 三、客户端获得用户授权,才能获得令牌,...
  • 单点登录权限管理-SSO

    千次阅读 2019-06-29 11:20:47
    源码练习下载:... 一、「单点登录权限管理」系列概述 结合实际项目,写写netty系列,但后面一个月工作会比较忙,就决定写写和后面工作关联度大的技术,一边调研、实践,一边整理、分享...
  • Shiro整合SSO单点登录系统

    万次阅读 2018-10-23 19:52:50
    本文的单点登录不是cas的,是公司...salt(盐)等信息,如果能查询到该用户,则说明单点登录成功并且在当前系统成功有权避开用户名密码的填写,完成系统单点登录。 第一次接触shiro框架代理的登录,让我去改造成...
  • JavaWeb跨域单点登录

    万次阅读 2018-07-31 11:48:36
    2、个项目单点登录,允许跨域访问; 3、预留CS架构客户端点击按钮打开浏览器免登录接口;   项目框架: 前端项目:html静态页面;前后端分离; 后端项目:javaweb项目,使用maven搭建的SSM项目,集成shiro...
  • 1.OAuth2.0有四种认证模式,常用的密码模式(本公司开发的各个系统)和授权码模式(针对第三方应用),他们均通过给客户端一个令牌来授权对资源所有者的资源。 2. OAuth2.0为用户和应用定义了以下角色: 资源...
  • 具备单点登录功能,并且能为第三方应用提供主流的登录认证。 具备用户的基本信息、角色、资源权限等集中管理和控制。 提供统一的集中办公Portal门户网站,在里面无缝链接其他系统的页面和功能。 关键...
  • 继续介绍「单点登录权限管理」系列的第一部分:单点登录权限管理本质,前一篇文章介绍了单点登录概念,以CAS协议的基本流程为例讲解了系统间的交互过程,过程中,cookie的设置和传输涉及的比较,如何保证...
  • 系统权限控制体系

    千次阅读 2018-04-27 20:19:32
    文 / 阿里P7工程师 严明明目录访问控制的本质:访问控制需要完成的两个任务:访问控制理论模型:Java常用访问控制框架:权限系统的演变历史:1: 标准的JAAS 时代;2: 单点登录(SSO)+接口鉴权时代;3: 统一登录...
  • SpringBoot模拟单点登录

    万次阅读 热门讨论 2017-11-30 21:48:34
    简言之,系统内部通过某种技术实现用户统一登录和注销,所以单点登录技术一定要包括两部分:登录、注销。出现的原因是Cookie不能跨域。 认证客户端应该具备的能力: 1必须以Filter或者插件等形式提供,方便系统接入...
  • PHP 单点登录SSO实现方式详解

    千次阅读 2018-03-21 11:55:26
    SSO( Single Sign On ),即单点登录,是一种控制多个相关但彼此独立的系统的访问权限, 拥有这一权限的用户可以使用单一的ID和密码访问某个或多个系统从而避免使用不同的用户名或密码,或者通过某种配置无缝地登录...
  • 20200519 uni-app 最实用的单点登录权限验证 登录方法 /** * 登录 */ sumbit () { this.$http.post('/sys/User/login', this.dataForm).then(({ data: res }) => { // 存储token uni....
  • 用java构建一个单点登录和安全验证系统单点登录系统需要提供10万级别用户访问群的承载,安全验证需提供各种可能的验证模式,验证方式采用一种高级的即可 安全验证同时需要提供一种比较好的权限控制机制,以实例...
  • JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构建大家需要的业务  一、KISSO单点登录介绍  kisso ...
  • 基于Vue实现后台系统权限控制

    万次阅读 2017-08-31 10:52:45
    原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载注明出处用Vue这类双向绑定框架做后台系统再适合不过,后台系统相比普通前端项目除了数据交互更频繁以外,还有一个特别的需求就是对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,539
精华内容 85,015
关键字:

单点登录多系统权限怎么控制