shiro与springSecurity( 三 )

springSecurity【1】什么是springSecurity
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作 。
【2】springSecurity的特点
1、与Spring无缝整合
2、全面的权限控制
3、专门为web开发而设计

  • 旧版本不能脱离Web环境使用
  • 新版本对整个框架进行了分层抽取,分成了核心模块和Web模块 。单独引入核心模块就可以脱离Web环境
4、重量级
【3】springSecurity核心功能
  • 认证
  • 授权
  • 攻击防护 (防止伪造身份)
其核心就是一组过滤器链,项目启动后将会自动配置 。核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式 。
shiro与springSecurity

文章插图
 
【4】springSecurity示例代码
坐标<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>启动类上加注解@SpringBootApplication@EnableTransactionManagement@ServletComponentScan@EnableScheduling@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)//开启springSecurity支持public class TakeOutApplication {public static void main(String[] args) {SpringApplication.run(TakeOutApplication.class, args);}}给需要权限的接口添加注解@GetMapping("/page")@PreAuthorize("hasAuthority('user-find')")public Result<Page> page(int page, int pageSize, String name) {//控制层代码//......return null;}配置类/** * @version 1.0 * @Author Harris * @since 2022/8/18 */@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests()//所有请求.antMatchers("/employee/**").authenticated()//所有/employee/**的请求必须认证通过.anyRequest().permitAll().and().exceptionHandling().accessDeniedHandler(new MyAccessFail()).authenticationEntryPoint((request, response, ex) -> {PrintWriter out = response.getWriter();out.println("NoLogin");//自定义未登录跳转(前后端分离)}).and().formLogin()//允许表单登录.loginProcessingUrl("/login").successForwardUrl("/employee/login-success");//自定义登录成功的页面地址}}认证接口/** * @version 1.0 * @Author Harris * @since 2022/8/26 */@Componentpublic class SpringDataUserDetailsService implements UserDetailsService {@Autowiredprivate EmployeeService employeeService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//1.根据页面提交的用户名username查询数据库User byName = employeeService.findByName(username);if (byName == null) {return null;}//获取权限List<String> permissions = employeeService.findPermissionsByUserId(String.valueOf(byName.getId()));String[] perarray = new String[permissions.size()];permissions.toArray(perarray);UserDetails userDetails = org.springframework.security.core.userdetails.User.withUsername(byName.getName()).password(byName.getPassword()).authorities(perarray).build();return userDetails;}}总结Shiro特点
  • 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
  • 异构客户端会话访问;
  • 非常简单的加密 API;
  • 不跟任何的框架或者容器捆绑,可以独立运行 。
Spring Security特点
  • 不能脱离Spring;
  • spring-security对spring结合较好,项目是spring-boot等搭建的,使用起来更加方便;
  • 有更好的spring社区进行支持;
  • 支持oauth授权 。
相同点
  • 认证功能
  • 授权功能
  • 加密功能
  • 会话管理
  • 缓存支持
不同点