# 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
 
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 extends GrantedAuthority> 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 extends SacRole> 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后续将被移除
以上是比较常用的配置项。
> **目前只是简单的初始化版本,后续会逐渐完善功能,尽量少使用代码来完成用户体系的集成。**