Security权限控制框架入门指南-Spring (security)
在罕用的后盾治理系统中,通常都会有访问权限控制的需求,用于限度不同人员关于接口的访问才干,假设用户不具有指定的权限,则不能访问某些接口。
本文将用waynboot-mall名目举例,给大家引见经常出现后管系统如何引入权限控制框架SpringSecurity。纲要如下:
waynboot-mall名目地址:
一、什么是SpringSecurity
SpringSecurity是一个基于Spring框架的开源名目,旨在为运行程序提供弱小和灵敏的安保性处置打算。SpringSecurity提供了以下特性:
二、如何引入SpringSecurity
在waynboot-mall名目中间接引入spring-boot-starter-security依赖,
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>3.1.0</version></dependency></dependencies>
三、如何性能SpringSecurity
在SpringSecurity3.0中要性能SpringSecurity跟以往是有些不同的,比如不在承袭WebSecurityConfigurerAdapter。在waynboot-mall名目中,详细性能如下,
@Configuration@EnableWebSecurity@AllArgsConstructor@EnableMethodSecurity(securedEnabled=true,jsr250Enabled=true)publicclassSecurityConfig{privateUserDetlsServiceImpluserDetailsService;privateAuthenticationEntryPointImplunauthorizedHandler;privateJwtAuthenticationTokenFilterjwtAuthenticationTokenFilter;privateLogoutSuccessHandlerImpllogoutSuccessHandler;@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttpSecurity)throwsException{httpSecurity//cors启用.cors(httpSecurityCorsConfigurer->{}).csrf(AbstractHttpConfigurer::disable).sessionManagement(httpSecuritySessionManagementConfigurer->{httpSecuritySessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS);}).exceptionHandling(httpSecurityExceptionHandlingConfigurer->{httpSecurityExceptionHandlingConfigurer.authenticationEntryPoint(unauthorizedHandler);})//过滤恳求.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry->{authorizationManagerRequestMatcherRegistry.requestMatchers("/favicon.ico","/login","/favicon.ico","/actuator/**").anonymous().requestMatchers("/slider/**").anonymous().requestMatchers("/captcha/**").anonymous().requestMatchers("/upload/**").anonymous().requestMatchers("/common/download**").anonymous().requestMatchers("/doc.").anonymous().requestMatchers("/swagger-ui/**").anonymous().requestMatchers("/swagger-resources/**").anonymous().requestMatchers("/webjars/**").anonymous().requestMatchers("/*/api-docs").anonymous().requestMatchers("/druid/**").anonymous().requestMatchers("/elastic/**").anonymous().requestMatchers("/message/**").anonymous().requestMatchers("/ws/**").anonymous()//除下面外的一切恳求所有须要鉴权认证.anyRequest().authenticated();}).headers(httpSecurityHeadersConfigurer->{httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable);});//处置跨域恳求中的Preflight恳求(cors),设置corsConfigurationSource后无需经常使用//.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()//关于登录login验证码captchaImage准许匿名访问httpSecurity.logout(httpSecurityLogoutConfigurer->{httpSecurityLogoutConfigurer.logoutUrl("/logout");httpSecurityLogoutConfigurer.logoutSuccessHandler(logoutSuccessHandler);});//参与JWTfilterhttpSecurity.addFilterBefore(jwtAuthenticationTokenFilter,UsernamePassAuthenticationFilter.class);//认证用户时用户信息加载性能,注入springAuthUserServicehttpSecurity.userDetailsService(userDetailsService);returnhttpSecurity.build();}@BeanpublicAuthenticationManagerauthenticationManager(AuthenticationConfigurationauthenticationConfiguration)throwsException{returnauthenticationConfiguration.getAuthenticationManager();}/***强散列哈希加密成功*/@BeanpublicBCryptPasswordEncoderbCryptPasswordEncoder(){returnnewBCryptPasswordEncoder();}}
这里详细引见下SecurityConfig性能类:
四、如何经常使用SpringSecurity
要经常使用SpringSecurity,只要要在须要控制访问权限的方法或类上参与相应的@PreAuthorize注解即可,如下,
@Slf4j@RestController@AllArgsConstructor@RequestMing("system/role")publicclassRoleControllerextendsBaseController{privateIRoleServiceiRoleService;@PreAuthorize("@ss.hasPermi('system:role:list')")@GetMapping("/list")publicRlist(Rolerole){Page<Role>page=getPage();returnR.success().add("page",iRoleService.listPage(page,role));}}
咱们在list方法上加了@PreAuthorize("@ss.hasPermi('system:role:list')")注解示意以后登录用户领有system:role:list权限才干访问list方法,否则前往权限失误。
五、失掉以后登录用户权限
在SecurityConfig性能类中咱们定义了UserDetailsServiceImpl作为咱们的用户信息加载的成功类,从而经过读取数据库中用户的账号、明码与前端传入的账号、明码启动比对。代码如下,
@Slf4j@Service@AllArgsConstructorpublicclassUserDetailsServiceImplimplementsUserDetailsService{privateIUserServiceiUserService;privateIDeptServiceiDeptService;privatePermissionServicepermissionService;publicstaticvoidmain(String[]args){BCryptPasswordEncoderbCryptPasswordEncoder=newBCryptPasswordEncoder();System.out.println(bCryptPasswordEncoder.encode("123456"));}@OverridepublicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{//1.读取数据库中以后用户信息Useruser=iUserService.getOne(newQueryWrapper<User>().eq("user_name",username));//2.判别该用户能否存在if(user==null){log.info("登录用户:{}不存在.",username);thrownewUsernameNotFoundException("登录用户:"+username+"不存在");}//3.判别能否禁用if(Objects.equals(UserStatusEnum.DISABLE.getCode(),user.getUserStatus())){log.info("登录用户:{}曾经被停用.",username);thrownewDisabledException("登录用户:"+username+"不存在");}user.setDept(iDeptService.getById(user.getDeptId()));//4.失掉以后用户的角色信息Set<String>rolePermission=permissionService.getRolePermission(user);//5.依据角色失掉权限信息Set<String>menuPermission=permissionService.getMenuPermission(rolePermission);returnnewLoginUserDetail(user,menuPermission);}}
针对UserDetailsServiceImpl的代码逻辑启动一个解说,大家可以配合代码了解。
总结一下
本文给大家解说了后管系统如何引入权限控制框架SpringSecurity3.0版本以及代码实战。置信能协助大家对权限控制框架SpringSecurity有一个明晰的了解。后续大家可以依照本文的经常使用指南一步一步将SpringSecurity引入到的自己的名目中用于访问权限控制。
「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证
启动项目时,SpringBoot自动检索所有带@Configuration的注解,所以就将我们的WebSecurityConfig给加载了,这个config中,我们需要在configure(AuthenticationManagerBuilder auth)方法中注册一个继承自UserDetailsService的接口,这个接口中只有一个方法,那就是使用username获取到数据库中用户信息并返回成UserDetail实体。 这个方法需要我们按照我们的不同业务场景重写 WebSecurityConfig MyUserDetailsService 其实如果去掉上面的将自定义的JWT过滤器加入到过滤链中的话,这个认证过程已经完成了。 使用下面的代码就可以调用起整个认证程序。 核心代码 这一行就会将username和password放到认证程序中进行认证。 也就是需要我们自己的逻辑让他去触发这个代码的实现。 就可以自动完成认证程序了。 就会触发使用username获取到数据库用户信息,然后经过密码加密比对之后会将认证结果返回。 我们整合JWT其实也很简单,其实就是将JWT的登录部分的操作,使用过滤器封装,将该过滤器放到整个认证的过滤链中 SpringSecurity过滤器的配置无非以下几个条件 先解决逻辑上以上三个问题的答案 针对以上解答,下面用代码来做展示(ps:序号依次对应上面) 完成了以上的配置,前台就可以使用/login/user来进行登录操作了。 登录成功会返回一个JSON对象来供前端判断成功与否 全部代码奉上,随意写的注释有点多,不看的可以给删掉
SpringSecurity认证流程分析
要想分析SpringSecurity的认证流程,就一定要先了解整个SpringSecurity的工作流程,我们才能最终进行一些自定义操作。
Spring Security的web基础是Filters(过滤器) ,它是通过一层层的Filters来对web请求做处理的,每一个web请求会经过一条过滤器链,在这个过程中完成认证与授权。
其具体工作流程是这样的:
有了以上的一些基础了解后,我们来顺着源码流程走一边,理清整个认证的流程。
基于formLogin的流程分析,SpringSecurity默认也是formLogin。
以下源码我都将注释去掉,否则太长了!
【项目实践】一文带你搞定前后端分离下的认证和授权|Spring Security + JWT
SpringSecurity+JWT认证流程解析 | 掘金新人第一弹
SpringSecurit(小胖哥)
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。