# opensource-sac **Repository Path**: jzlol/opensource-sac ## Basic Information - **Project Name**: opensource-sac - **Description**: SAC定位是一个轻量级的用户认证框架,基于Spring Security开发,提供了用户认证,鉴权等功能,支持JWT、SESSION等认证方式。可以灵活的与本地的用户体系进行集成,与业务高度解耦,也提供了可选的用户持久层,对于没有本地用户体系的应用系统,可以直接使用,而如果应用系统有自己的用户体系,则可以使用不使用框架提供的持久层模块。 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-12-19 - **Last Updated**: 2023-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringSecurity, 用户认证, Java, SpringBoot ## README # SAC ![platform](https://img.shields.io/badge/java-1.8%2B-brightgreen) ![dependency](https://img.shields.io/badge/dependencies-spring%20security-yellow) SAC定位是一个轻量级的用户认证框架,基于Spring Security开发,提供了用户认证,鉴权等功能,支持JWT、SESSION等认证方式。可以灵活的与本地的用户体系进行集成, 与业务高度解耦,也提供了可选的用户持久层,对于没有本地用户体系的应用系统,可以直接使用,而如果应用系统有自己的用户体系,则可以使用不使用框架提供的持久层模块。 ## 模块介绍 ### sac-core --- sac的核心模块,基于spring security进行的二次开发。通常在使用时不需要直接引入该模块,而是引入sac-spring-boot-starter模块。 ### sac-spring-boot-starter --- sac的主要模块,实际是一个springboot的starter,内部集成了sac-core模块,内部对一些配置类做了初始化,并且对外暴露了一些配置项。 使用步骤: 1.引入maven依赖 ```xml com.sztech sac-spring-boot-starter ${sac.version} ``` 2.实现UserDetails接口 ```java @TableName(value = "sys_user") @Data public class SysUser implements SacUser { @Override public String getUsername() { return loginName; } @Override public Collection getAuthorities() { List authorities = new ArrayList<>(); if (!CollectionUtils.isEmpty(roleList)) { roleList.stream().forEach(role -> authorities.add(new SimpleGrantedAuthority(String.valueOf(role.getId())))); } return authorities; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } } ``` 需要实现UserDetails内部的方法,如果你使用了sac-respository或者sac-repository-workbench模块,直接跳过这个步骤,如果你使用的是你自定义的用户体系,需要执行这个步骤。 3.实现UserDetailsService接口 ```java @Service public class UserServiceImpl implements UserDetailsService { @Autowired private SysUserMapper sysUserMapper; @Autowired private SysOrganizationMapper sysOrganizationMapper; @Override public UserDetails loadUserByUsername(String loginName) throws UsernameNotFoundException { SysUser sysUser = sysUserMapper.selectFullUserInfoByLoginName(loginName); Optional.ofNullable(sysUser).orElseThrow(() -> new BizException(Constants.ResultCode.ERROR.getStatus(), "未找到登录用户")); List organizations = sysOrganizationMapper.listByUserId(sysUser.getId()); sysUser.setOrganizationList(organizations); return sysUser; } } ``` 4.自定义UrlFilterInvocationSecurityMetadataSource ```java @Component public class MyUrlFilterInvocationSecurityMetadataSource extends UrlFilterInvocationSecurityMetadataSource { @Autowired private SysResourceMapper sysResourceMapper; @Autowired private SysRoleMapper sysRoleMapper; @Override protected SacPermission findPermissionByUrl(String url) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("url", url); SysResource sysResource = sysResourceMapper.selectOne(queryWrapper); return sysResource; } @Override protected List findPermissionRole(String permissionCode) { List sysRoles = sysRoleMapper.listByResourceId(Integer.parseInt(permissionCode)); return sysRoles; } } ``` 内部实现了两个方法,findPermissionByUrl,根据url查询资源信息;findPermissionRole,根据资源编码查询角色信息。 6.yml文件中配置参数 ```yaml opensource: sac: login: /auth enableVerCode: false authMode: workbench tokenCachedTimeInSeconds: 3600000 tokenExpiredTimeInSeconds: 3000000 ssoCheckUrl: http://192.168.5.186/SysManager/api/checkToken ssoUserInfoUrl: http://192.168.5.186/SysManager/sys/user/userInfo enableMultipleToken: true avoidPath: - /sso/** - /test onlyAuthPath: - /user urlRule: - /user:anon|auth|perm[admin,normal] passwordTransportMode: rsa config: adapter: true ``` - **login:** 登录地址,默认也是auth - **enableVerCode:** 是否开启验证码,默认不开启 - **authMode:** 验证模式,包括jwt、session、workbench、simple、sso等,如果是独立系统,建议选择jwt或者session,如果对接中台使用workbench,simple内部不做权限校验,只对token进行校验 - **tokenCachedTimeInSeconds:** token缓存的有效期 - **tokenExpiredTimeInSeconds:** token的有效期 - **ssoCheckUrl:** 单点登录(包括中台)token验证接口地址 - **ssoUserInfoUrl:** 单点登录(包括 中台)用户信息获取接口地址 - **enableMultipleToken:** 是否开启多token(即支持多人登录),默认false - **avoidPath:** 免认证的访问路径,配置之后对应的路径将不在进行权限校验,支持ant语法 - **passwordTransportMode:** 前端调用登录接口时密码传输的加密模式,rsa:rsa加密,plain:明文,默认为rsa - **config.adapter:** 是否开启对低版本spring security的支持,true:支持,false:不支持,默认为false - **rsaPrivateKey:** rsa私钥,用于在passwordTransportMode=rsa模式时,RSA算法的私钥,用于解密 - **rsaPublicKey:** rsa公钥,用于在passwordTransportMode=rsa模式时,RSA算法的公钥,用于加密 - **onlyAuthPath:** 只验证登录的路径,配置之后对应的路径只校验登录状况,不校验授权 - **urlRule:** 访问路径规则,结合了avoidPath和onlyAuth两个参数的功能,格式为url:op,url表示访问路径,op可选anon、auth和perm,表示对url的访问规则,anon表示匿名访问,auth表示需要登录之后访问,perm可指定某些角色访问,建议直接使用该参数,avoidPath和onlyAuthPath后续将被移除 以上是比较常用的配置项。 > **目前只是简单的初始化版本,后续会逐渐完善功能,尽量少使用代码来完成用户体系的集成。**