# small-auth-starter **Repository Path**: White-s/small-auth-starter ## Basic Information - **Project Name**: small-auth-starter - **Description**: 项目基于`SpringSecurity` 开发,针对日常系统中的认证、动态鉴权的统一封装。有小又快! - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-30 - **Last Updated**: 2023-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 项目基于`SpringSecurity` 开发,针对日常系统中的认证、动态鉴权的统一封装。对后期使用简单方便。 # 包结构 ``` ├─authentication 鉴权相关处理 └─SmallAccessDecisionManager 匹配当前url权限(对应的角色)用户是否拥有 └─SmallSecurityMetadataSource 匹配当前url所对应的角色 ├─authorization 认证相关处理 └─SmallAuthenticationToken 自定义token └─SmallAuthenticationTokenProvider 核心认证方法 ├─config Security配置 ├─constant 常量 ├─filter 全局过滤器(登录入口、JWT 处理入口) └─SmallAuthenticationProcessingFilter 认证入口 └─SmallJwtFilter jwt通用过滤器, 用于解析jwt, 并将用户信息设置到上下文中 ├─handle 认证、鉴权结果处理器 ├─loginlogic 登录逻辑 │ └─base ├─model 实体 └─utils 工具类 ``` # 快速开始 ### 1、引入依赖 ```xml com.syl small-auth-starter 1.0-SNAPSHOT ``` ### 2、提供查询用户信息接口 ```java @Override public UserDTO getUserMessage(LoginDTO loginDTO) { UserDTO userDTO = null; Integer userType = loginDTO.getUserType(); String loginKey = loginDTO.getLoginKey(); String password = loginDTO.getPassword(); String loginType = loginDTO.getLoginType(); switch (loginType) { //用户名密码 case "password": userDTO = userService.checkUserByUserName(loginKey, password); break; // 手机号验证码登录 case "phoneCode": userDTO = userService.checkUserByPhoneCode(loginKey); break; default: break; } return userDTO; } ``` ### 3、实现登录逻辑 ```java /** * @ClassName PhoneLogin * @Description 账号密码登录逻辑 * @Author YunLong * @Date 2023/5/26 9:49 */ @Component @Slf4j public class PasswordLogin extends AbstractLoginLogic { @Resource private UserClientImpl userClient; @Override public String getSupportLoginType() { return "password"; } /** * @Author YunLong * @Date 2023/5/26 10:33 * @Description 登录前的操作, 一般校验LoginData的数据完整性 **/ @Override protected void beforeLogin(LoginData loginData) { log.info("账号密码登录前的操作。loginData:{}", loginData); } @Override protected void login(LoginData loginData) { log.info("账号密码登录中……。loginData:{}", loginData); } /** * @Author YunLong * @Date 2023/5/26 9:56 * @Description 做一些登录后的操作 **/ @Override protected void afterLogin(SmallUserInfo smallUserInfo) { log.info("账号密码登录成功。user:{}", smallUserInfo); } @Override protected SmallUserInfo getUserDetails(LoginData loginData) { LoginDTO loginDTO = new LoginDTO(); loginDTO.setLoginKey(loginData.getUsername()); loginDTO.setPassword(loginData.getPassword()); loginDTO.setLoginType(loginData.getLoginType()); loginDTO.setPassword(loginData.getPassword()); // 通过账号密码获取用户信息 UserDTO userMessage = userClient.getUserMessage(loginDTO); if (userMessage != null) { // 获取查询出来的角色ids List collect = userMessage.getRoleDTOS().stream() .map(e->{return e.getId().toString();}) .collect(Collectors.toList()); SmallUserInfo smallUserInfo = new SmallUserInfo(); smallUserInfo.setId(Long.valueOf(userMessage.getId())); smallUserInfo.setUsername(userMessage.getUserName()); smallUserInfo.setPhone(userMessage.getPhone()); smallUserInfo.setOrgId(Long.valueOf(userMessage.getOrgId())); smallUserInfo.setOrgName(userMessage.getOfficeName()); smallUserInfo.setRoleList(collect); return smallUserInfo; } return null; } } ``` ### 4、实现资源查询接口。提供查询此接口对应的角色信息 ```java /** * @ClassName ResourceUrlServiceImpl * @Description 实现url对应角色id的查询逻辑 * @Author YunLong * @Date 2023/5/26 16:10 */ @Service public class ResourceUrlServiceImpl implements com.syl.auth.authentication.ResourceService { @Resource SysRoleResourceDao sysRoleResourceDao; @Override public List getRolesByUrl(String url) { List roleIds = sysRoleResourceDao.selectListByResourceUrl(url); return roleIds; } } ``` ## 可配置项 以下配置均有默认值,可重新配置进行覆盖。 ```yaml small-security: not-login-urls: # 指定无需登录即可访问的接口 - /user login-url: # 指定登录接口的url expiration: # 指定 token 过期时间 jwt-secret: # 指定 Jwt 密匙 authentication-failed-code: # 指定登录失败错误码 unauthorized-code: # 指定未认证错误码 permission-denied-code: # 指定未授权错误码 no-roles-pass: # 未配置Url时,是否直接放行 ``` ### 认证成功处理器 在实际开发中,我们可能需要存储 token。可实现 `LoginSuccessResultHandler` 接口来自定义功能。 ```java @Component public class GGLoginFailureResultHandler implements LoginFailureResultHandler { @Override public Object handleResult(AuthenticationException e) { return null; } } ``` ### 首次认证流程 ```mermaid graph TD; A(登录请求) -->b(SmallAuthenticationProcessingFilter) --> C(SmallAuthenticationTokenProvider) -->D{AbstractLoginLogic} D--> |无异常| D1(SmallAuthenticationSuccessHandler) -->D2(LoginSuccessResultHandler) -->D3[认证成功] D--> |有异常| D4(SmallAuthenticationFailureHandler) -->D5(LoginFailureResultHandler) -->D6[认证失败] ``` ### 后续业务请求 ```mermaid graph TD A(业务请求) --> B(SmallJwtFilter) --> C(SmallSecurityMetadataSource) --> D(SmallAccessDecisionManager) --> E{异常} E --> |有异常| E1[业务请求失败, 无权访问] E --> |无异常| E2(鉴权成功) --> E3[处理业务] ```