SpringSecurity+OAuth2+JWT权限架构原理和整合(如何实现SSO单点登录)

一、常用安全框架

1.1SpringSecurity 是Spring家族一员,是一个能够为基于spring的企业应用系统提供声明式的安全访问控制解决方方案的安全框架,它提供了一组可以在Spring应用上下问中配置的Bean,充分利用了Spring Ioc,DI和Aop功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。(有了Springboot后使用的更广泛一些,可以高度自定义)
1.2Apache Shiro 一个功能强大且易于使用的java安全架构,提供了认证,授权加密和会话管理等,(轻量级的)

二、SpringSecurity相关代码和配置

Demo链接:0分下载SpringSecurity练习demo

2.1.SpringSecurity如何修改默认登录逻辑和相关页面和密码等,

一、自定义登录逻辑,新增一个User继承UserDetails和实现UserDetailsService接口,在UserDetailsService
的loadUserByUsername方法里面进行账号密码等进行校验,然后范围权限(多个用,分割,角色前面必须是ROLE_前缀)
二、密码可以用PasswordEncoder进行加密
三、自定义登录页面和登录失败页面:实现WebSecurityConfigurerAdapter,实现configure(HttpSecurity http)方法。
http的相关配置:

//自定义登录表单
http.formLogin()
//               .loginPage("/login.html")
//                     //自定义登录逻辑
//                    .loginProcessingUrl("/login")
//                      //登录成功后跳转页面,post请求
//                    .successForwardUrl("/toMain")
//                    //.successHandler(new MyAuthenicationSuccessHandler("main.html"))
//                      //登录失败跳转错误页
//                    .failureForwardUrl("/toError");
//                    // .defaultSuccessUrl("/").failureHandler(loginFailureHandle);
//                    //.failureHandler(new MyAuthenticationFailureHandler("/error.html"))
//           ;
//            //授权
//            http.authorizeRequests()
//                    //放行/login.html
//                    .antMatchers("/login.html").permitAll()
//                    .antMatchers("/error.html").permitAll()
//                    .antMatchers("/druid/**").permitAll()
//                    //角色控制权限
//                    //.antMatchers("/main1.html").hasRole("cc")
//
//                  // .antMatchers("/main1.html").access("hasRole('bb')")
//                    //权限控制
//                    // .antMatchers("/main1.html").hasAuthority("Admin1")
//                    //放行/error.html
//                   // .antMatchers("/error.html").permitAll()
//                    //放行images目录图片
//                    //.antMatchers("/images/**").permitAll()
//                    //.antMatchers("/**/*.jpg").permitAll()
//                   // .regexMatchers(".+[.]jpg").permitAll()
//                    //认证拦截所有请求,必须登录
//                    .anyRequest().authenticated();

2.2权限相关

Springboot启动类加上prePostEnabled = true
prePostEnabled访问前验证

2.OAuth2(例子,第三方登录,微信,微博等)

OAuth协议为用户资源的授权提供安全的
开放而又简易的标准
在这里插入图片描述
在这里插入图片描述
OAuth2原理图

3.JWT(Json Web Tokens)令牌是一种基于标准RFC 7519方法的开放行业,用于在双方之间安全地表示声明。IO允许您解码、验证和生成JWT。

在这里插入图片描述

JJWT是java实现jwt标准的一个jar包

4.SpringSecurity整合JWT

一.TokenStore调用获得加盐的JwtTokenStore
二.JwtAccessTokenConverter当成功获得Token后加盐,在转换为jwtToken
三.然后configure方法写

endpoints.authenticationManager(authenticationManager)
        .userDetailsService(userDetailService)
        .tokenStore(tokenStore)
        .accessTokenConverter(jwtAccessTokenConverter);

5.SpringSecurity整合OAuth2+JWT实现Sso单点登录

一.创建一个服务端oauth2-client1-demo,要引入下面的jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二.然后application.properties配置

#应用服务 WEB 访问端口
server.port=8081
#防止Cookie冲突,冲突会导致登录验证不通过
server.servlet.session.cookie.name=OAUTH2-CLINET-SESSIONID01
#授权服务器地址
oauth2-server-url: http://localhost:8080
#与授权服务器对应配置
security.oauth2.client.client-id=client
security.oauth2.client.client-secret=123456
security.oauth2.client.user-authorization-uri= ${oauth2-server-url}/oauth/authorize
security.oauth2.client.access-token-uri=${oauth2-server-url}/oauth/token
security.oauth2.resource.jwt.key-uri=${oauth2-server-url}/oauth/token_key

三.写一个可以调用的资源Controller(接口/user/getCurrentUser)

四.客服端AuthorizationServerConfig重写 configure(AuthorizationServerSecurityConfigurer security)
//配置密钥 单点登录必须要配置的
security.tokenKeyAccess(“isAuthenticated()”);

五.configure(ClientDetailsServiceConfigurer clients)方法重定向到客服端的登录页
.redirectUris(“http://localhost:8081/login”)
//自动授权
.autoApprove(true)

六.启动服务端和客服端访问http://localhost:8081/user/getCurrentUser

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值