spring security oauth2记录

实例: https://blog.csdn.net/xyjcfucdi128/article/details/87163388   --转载

demo是下载的, 上面是原博主的博客, 记录一下使用demo过程的一些问题

依赖:

由于 Spring Boot 中的 OAuth 协议是在 Spring Security 基础上完成的。因此首先编辑 pom.xml,添加 Spring Security 以及 OAuth 依赖。

 

认证服务器的配置有哪些?

主要集中在资源的获取源配置、缓存配置

oauth认证服务器还需要提供一个返回Principal对象的接口,具体作用会在下文中详解

@RestController
@RequestMapping("/api")
public class MemberController {

    @GetMapping("/member")
    public Principal user(Principal member) {
        //获取当前用户信息
        return member;
    }
}

 

如何实现对请求的拦截?

微服务架构需要在每个服务配置spring security的拦截规则,使用@Configuration和@EnableWebSecurity注解 ,如下图

.antMatchers("/api/**").authenticated()  //对所有api/**请求拦截

 

拦截的请求返回401, 需要请求token:

/oauth/token的接口是框架提供的, 选择Basic Auth填写客户端信息

客户端信息来源: 内存或者数据库

选择数据库来源, 需要存储在表oauth_client_details

token请求后的存储: 

在认证服务器中会配置redisToken存储, 同时redis的过期时间很适合token设置有效时间。

 

权限资源又是怎么获取到的?

用户请求token时会调用loadUserByUsername()方法,返回user对象,该对象包含用户的权限资源。

/**
 * 〈自定义UserDetailService〉
 * 自定义认证逻辑
 * @author wangmx
 * @since 1.0.0
 */
@Service//("userDetailService")
public class MyUserDetailService implements UserDetailsService {

    @Autowired
    private MemberDao memberDao;

    @Override
    public UserDetails loadUserByUsername(String memberName) throws UsernameNotFoundException {
        Member member = memberDao.findByMemberName(memberName);
        if (member == null) {
            throw new UsernameNotFoundException(memberName);
        }
        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
        // 可用性 :true:可用 false:不可用
        boolean enabled = true;
        // 过期性 :true:没过期 false:过期
        boolean accountNonExpired = true;
        // 有效性 :true:凭证有效 false:凭证无效
        boolean credentialsNonExpired = true;
        // 锁定性 :true:未锁定 false:已锁定
        boolean accountNonLocked = true;
        for (Role role : member.getRoles()) {
            //角色必须是ROLE_开头,可以在数据库中设置
            GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName());
            grantedAuthorities.add(grantedAuthority);
            //获取权限
            for (Permission permission : role.getPermissions()) {
                GrantedAuthority authority = new SimpleGrantedAuthority(permission.getUri());
                grantedAuthorities.add(authority);
            }
        }
        User user = new User(member.getMemberName(), member.getPassword(),
                enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuthorities);
        return user;
    }

}

请求资源服务器api,怎么判断用户是否有该api访问权限?

请求/api/current接口,成功返回结果

断点看一下访问流程,发现会调用oauth认证服务器的接口/member

由此可以知道,用户在访问权限控制的接口时,需要通过认证服务器提供的接口返回principal对象,进行资源的匹配,有权限则成功访问。

 

那资源服务器又是怎么找到认证服务器提供的接口呢?

答案就是在bootstrap.yml文件中配置认证服务器的接口地址

 

ResourceServerConfig配置中可以不拦截请求,通过@PreAuthorize注解需要权限控制的接口

当使用hasRole权限时,需要加前缀ROLE_,否则会拒绝访问

数据库修改成

其他表达式:

 

参考: https://blog.csdn.net/qq_22172133/article/details/86503223  --springSecurity

https://blog.csdn.net/qq_41948525/article/details/106589811 --.关于SpringSecurity安全拦截请求.authenticated()未起作用

关于oauth的概念,参考上一节 oauth

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值