# easy-spring-security-starter **Repository Path**: lglbc/easy-spring-security-starter ## Basic Information - **Project Name**: easy-spring-security-starter - **Description**: 如果你在使用Spring Security时,让你感到无从下手,太多定制化内容,也不知道从哪开始,那么推荐你使用这款框架,帮助你快速集成Spring Security 宗旨:让从未接触过Spring Security的开发者,也能快速集成和使用Spring Security框架. - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2023-07-02 - **Last Updated**: 2024-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringSecurity ## README ## 版本说明 基于Spring Security 6开发 ## 快速集成教程 ### 添加仓库 任选其中一个 ``` maven { url "https://s01.oss.sonatype.org/service/local/repositories/releases/content" } maven { url "https://repo1.maven.org/maven2" } ``` ### 引入依赖 * gradle ``` dependencies { implementation 'io.gitee.lglbc:easy-spring-security-starter:1.0.2' } ``` * maven ``` io.gitee.lglbc easy-spring-security-starter 1.0.2 ``` ### 定义用户信息获取方式 因为在用户登录校验时,需要根据账号去查询密码,权限,所以这部分需要自己定义,在这里我们只需要实现EasyLogin接口即可,实现自己的业务逻辑.你可以引入MyBatis查询,我这边演示是基于内存Map存储用户信息 ``` @Component public class TestEasyLogin implements EasyLogin { public static Map userMap = Map.of( "lglbc","{noop}123456", "ams","{noop}45678" ); @Override public SimpleUser loadUser(String userName) { if (!userMap.containsKey(userName)) { return null; } String password = userMap.get(userName); SimpleUser simpleUser = new SimpleUser(); simpleUser.setUserName(userName); simpleUser.setPassword(password); simpleUser.setPermissions(List.of("A","B")); simpleUser.setRoles(List.of("user","admin")); return simpleUser; } } ``` ### 启动项目验证 #### 登录成功 ``` curl --location 'http://localhost:8080/login' \ --header 'Content-Type: application/json' \ --header 'Cookie: JSESSIONID=BAC13762365A696CBC3A58C84775928D' \ --data '{ "username":"lglbc", "password":"123456" }' ``` ``` {"msg":"登录成功 默认","code":-1,"data":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdXRob3JpdGllcyI6WyJBIiwiQiIsIlJPTEVfYWRtaW4iLCJST0xFX3VzZXIiXSwiZXhwIjoxNjg4MzA5NTQ5NzE2LCJpYXQiOjE2ODgzMDU5NDk3MTYsImp0aSI6ImUzOTZlYzQ3LTY0N2MtNGRlNS1hMTNhLWIyNTI5OWMyMWQ3ZiIsInN1YiI6ImxnbGJjIiwidXNlcm5hbWUiOiJsZ2xiYyJ9.gSgb0MyZUapwQ6qO2oPNrAzhN9e8ifojFnGjJJ6q7KybYapSjWf8j5CIbymX_YOM8acM5vgwsyKjg_r_t7gBZ_ViWjxVdGkFtuMz0440aXrOH9U8TZSk74dWyzr7unIw4e8J1bGUZyPei1CBfDihlhHKitpVqWsXzKd_WYUJ5COqDkwIYI_P6rKR_mKniMHVLFln0Fubx2Pry-66Tid98KYIWhJMR6OKGK4RFtMoX19EcEysXwM4KatwkCXhgXq8nVmdLCedX505bTe6mMgpmWr5zRMGrI0pG_na80OxirGbKe5W5rKz8m5SchtyuWd7zqQgb0IPpQCds5ucYHHNqg"} ``` #### 登录失败 ``` curl --location 'http://localhost:8080/login' \ --header 'Content-Type: application/json' \ --header 'Cookie: JSESSIONID=BAC13762365A696CBC3A58C84775928D' \ --data '{ "username":"lglbc2", "password":"123456" }' ``` ``` {"msg":"登录失败 默认","code":-1,"data":"用户名或密码错误"} ``` #### 调用没权限接口 ``` {"msg":"无权限访问 默认","code":-1,"data":"Access Denied"} ``` #### token 验证失败或过期 ``` {"msg":"token verify failed","code":"403","data":"默认实现"} ``` ## 高级用法 ### 自定义返回结果 每个项目的返回结果的结构肯定都不一样,默认的返回结果肯定不满足需求,所以我们可以自定义返回结果,只需要实现接口EasySecurityResultHandler里面的方法即可.需要注意的是我们需要加上@Primary注解才能覆盖默认实现。 ``` @Component @Primary public class CustomExceptionResult implements EasySecurityResultHandler { @Override public void noPermissionHandler(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) { JsonResponseUtil.out(response, "无权限访问 自定义"); } @Override public void noPermissionHandler(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) { JsonResponseUtil.out(response, "认证失败 自定义"); } @Override public void loginFailedHandler(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) { JsonResponseUtil.out(response, "登录失败 自定义"); } @Override public void loginSuccessHandler(HttpServletRequest request, HttpServletResponse response, Authentication authentication, String token) { JsonResponseUtil.out(response, token+" 自定义"); } @Override public void tokenVerifyFailed(HttpServletResponse response, TokenException tokenException) { JsonResponseUtil.out(response, "token验证失败 自定义" + tokenException.getMsg()); } } ``` ### 忽略不需要验证的接口 只需要在配置文件中配置list即可 ``` easy: security: ignoreUrls: - /test10 - /test20 ``` ### 自定义token密钥 因为系统默认使用对称加密密钥为123456,项目都需要使用自己的密钥 ``` easy: security: ignoreUrls: - /test10 token: expireTime: 3600 secret: 123456 ``` ### 使用非对称密钥加密token 如果开启了enableRSA。需要填写jksSecret和jksPath ``` easy: token: expireTime: 3600 enableRSA: true jksSecret: 123456 jksName: /Users/lglbc/Desktop/code/easy-spring-security-starter-demo/src/main/resources/jwt.jks ``` ### 添加验证码验证 实现EasyLogin->preCheck方法,系统在进行用户名密码认证之前会调用这个方法,所以基于这个方法我们可以去自定义验证码登录逻辑,系统也提供了生成验证码的接口 /kaptcha,并且会回调EasyLogin->saveCaptcha 触发验证码保存映射关系逻辑,这一部分需要自己实现 ### 更多功能 更多功能正在开发中.希望大家能够提出更多宝贵的建议和需求. ### 最后 如果想参与进来一起维护这个开源项目,可以加我的微信“AmsNeil”,备注 ‘开源’