首页
归档
关于
Search
1
C服务器端
9 阅读
2
1.数据流图(下午题)
8 阅读
3
管道处理模型
8 阅读
4
数据结构与算法
8 阅读
5
3.面向对象设计
7 阅读
软件设计师笔记
.Net
Java
数据库
PHP
运维
前端
Python
中间件相关
云原生
架构设计
Search
标签搜索
websocket
科技新闻
Bi8bo
累计撰写
267
篇文章
累计收到
2
条评论
首页
栏目
软件设计师笔记
.Net
Java
数据库
PHP
运维
前端
Python
中间件相关
云原生
架构设计
页面
归档
关于
搜索到
267
篇与
的结果
2025-04-03
SpringSecurity简单搭建
- 添加 Spring Security 依赖首先我默认大家都已经了解 Spring Boot 了,在 Spring Boot 项目中添加依赖是非常简单的.把对应的spring-boot-starter-* 加到pom.xml 文件中就行了 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>- 配置 Spring Security简单的使用 Spring Security 只要配置三个类就完成了,分别是:UserDetails这个接口中规定了用户的几个必须要有的方法public interface UserDetails extends Serializable { //返回分配给用户的角色列表 Collection<? extends GrantedAuthority> getAuthorities(); //返回密码 String getPassword(); //返回帐号 String getUsername(); // 账户是否未过期 boolean isAccountNonExpired(); // 账户是否未锁定 boolean isAccountNonLocked(); // 密码是否未过期 boolean isCredentialsNonExpired(); // 账户是否激活 boolean isEnabled(); }UserDetailsService这个接口只有一个方法 loadUserByUsername,是提供一种用 用户名 查询用户并返回的方法。public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }WebSecurityConfigurerAdapter这个内容很多,就不贴代码了,大家可以自己去看.我们创建三个类分别继承上述三个接口此 User 类不是我们的数据库里的用户类,是用来安全服务的. * Created by Yuicon on 2017/5/14. * https://segmentfault.com/u/yuicon */ public class User implements UserDetails { private final String id; //帐号,这里是我数据库里的字段 private final String account; //密码 private final String password; //角色集合 private final Collection<? extends GrantedAuthority> authorities; User(String id, String account, String password, Collection<? extends GrantedAuthority> authorities) { this.id = id; this.account = account; this.password = password; this.authorities = authorities; } //返回分配给用户的角色列表 @Override public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } @JsonIgnore public String getId() { return id; } @JsonIgnore @Override public String getPassword() { return password; } //虽然我数据库里的字段是 `account` ,这里还是要写成 `getUsername()`,因为是继承的接口 @Override public String getUsername() { return account; } // 账户是否未过期 @JsonIgnore @Override public boolean isAccountNonExpired() { return true; } // 账户是否未锁定 @JsonIgnore @Override public boolean isAccountNonLocked() { return true; } // 密码是否未过期 @JsonIgnore @Override public boolean isCredentialsNonExpired() { return true; } // 账户是否激活 @JsonIgnore @Override public boolean isEnabled() { return true; } }继承 UserDetailsService Created by Yuicon on 2017/5/14. https://segmentfault.com/u/yuicon */ @Service public class UserDetailsServiceImpl implements UserDetailsService { // jpa @Autowired private UserRepository userRepository; /** 提供一种从用户名可以查到用户并返回的方法 @param account 帐号 @return UserDetails @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String account) throws UsernameNotFoundException { // 这里是数据库里的用户类 User user = userRepository.findByAccount(account); if (user == null) { throw new UsernameNotFoundException(String.format(没有该用户 '%s'., account)); } else { //这里返回上面继承了 UserDetails 接口的用户类,为了简单我们写个工厂类 return UserFactory.create(user); } } } UserDetails 工厂类 Created by Yuicon on 2017/5/14. https://segmentfault.com/u/yuicon */ final class UserFactory { private UserFactory() { } static User create(User user) { return new User( user.getId(), user.getAccount(), user.getPassword(), mapToGrantedAuthorities(user.getRoles().stream().map(Role::getName).collect(Collectors.toList())) ); } //将与用户类一对多的角色类的名称集合转换为 GrantedAuthority 集合 private static List<GrantedAuthority> mapToGrantedAuthorities(List<String> authorities) { return authorities.stream() .map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); } } 重点, 继承 WebSecurityConfigurerAdapter 类 Created by Yuicon on 2017/5/14. https://segmentfault.com/u/yuicon */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // Spring会自动寻找实现接口的类注入,会找到我们的 UserDetailsServiceImpl 类 @Autowired private UserDetailsService userDetailsService; @Autowired public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { authenticationManagerBuilder // 设置UserDetailsService .userDetailsService(this.userDetailsService) // 使用BCrypt进行密码的hash .passwordEncoder(passwordEncoder()); } // 装载BCrypt密码编码器 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } //允许跨域 @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**).allowedOrigins(*) .allowedMethods(GET, HEAD, POST,PUT, DELETE, OPTIONS) .allowCredentials(false).maxAge(3600); } }; } @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity // 取消csrf .csrf().disable() // 基于token,所以不需要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, /).permitAll() // 允许对于网站静态资源的无授权访问 .antMatchers( HttpMethod.GET, /, /*.html, /favicon.ico, //.html, /**/.css, //*.js, /webjars/, /swagger-resources/, /*/api-docs ).permitAll() // 对于获取token的rest api要允许匿名访问 .antMatchers(/auth/).permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); // 禁用缓存 httpSecurity.headers().cacheControl(); } } - 控制权限到 controller使用 @PreAuthorize("hasRole('ADMIN')") 注解就可以了/** 在 @PreAuthorize 中我们可以利用内建的 SPEL 表达式:比如 'hasRole()' 来决定哪些用户有权访问。 需注意的一点是 hasRole 表达式认为每个角色名字前都有一个前缀 'ROLE_'。所以这里的 'ADMIN' 其实在 数据库中存储的是 'ROLE_ADMIN' 。这个 @PreAuthorize 可以修饰Controller也可修饰Controller中的方法。 **/ @RestController @RequestMapping(/users) @PreAuthorize(hasRole('USER')) //有ROLE_USER权限的用户可以访问 public class UserController { @Autowired private UserRepository repository; @PreAuthorize(hasRole('ADMIN'))//有ROLE_ADMIN权限的用户可以访问 @RequestMapping(method = RequestMethod.GET) public List<User> getUsers() { return repository.findAll(); } } - 结语
2025年04月03日
0 阅读
0 评论
0 点赞
2025-04-03
SpringBoot 添加 SpringSecurity 支持
@EnableWebSecurity 开启SpringSecurity服务 //继承WebSecurityConfigureAdapter类 //授权 ------------------------------------- //重写 configure(HttpSecurity http)//方法 http.authorizeRequest() //请求授权 .antMatchers()//匹配路径 .hasRole("角色") //没有权限就跳转登录界面 默认跳转url:/login 默认登录错误url:/login?error http.formLogin() //开启注销 http.logout() //注销成功跳转login?success .invalidateHttpSession() 失效所有session //认证-------------------------------------- //重写 configure(AuthenticationBuilder auth)//方法 //SpringSecurity链式书写 auth.inMemoryAuthentication() //在内存中认证 .withUser("用户名").password("").roles("角色") .and().withUser() //继续//Spring Security 5+ 需要密码加密 PasswordEncoder auth.inMemoryAuthentication() .passwordEncoder(new BCryptPasswordEncoder()) //官方推荐的编码方式 .withUser("用户名").password(new BCryptPasswordEncoder().encode("密码")) //编码JDBC权限验证
2025年04月03日
0 阅读
0 评论
0 点赞
2025-04-03
spring security
(17条消息) spring security_小鱼儿的专栏-CSDN博客
2025年04月03日
0 阅读
0 评论
0 点赞
2025-04-03
Hystrix-服务降级-服务熔断-服务限流
服务雪崩多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和C又调用其他的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统的崩溃,这就是所谓的“雪崩效应”。对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟达到饱和。甚至更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源的紧张,导致整个系统发生更多的级联故障。这些否表示需要对故障和延迟进行隔离管理,以便使单个依赖的失败,不能取消整个应用的系统。服务降级例如服务器忙,请稍后再试,不让客户端等待,直接返回一个友好提示,fallback。哪些情况下会出现服务降级?程序运行异常超时服务熔断触发服务降级线程池/信号量打满也会导致服务降级当我们的服务器压力剧增,为了保证核心功能的可用性,选择降低一些功能的可用性,或者直接关闭其他不必要的功能。一般而言会独立建立降级系统,可以灵活的配置服务器的降级功能。当然也有用代码自动降级,例如接口超时降级,失败多次重试降级。服务熔断熔断一般是指依赖的外部接口出现了故障,需要断绝和外部接口的关系。例如A服务调用B服务,B服务调用C服务,C因为某种原因突然变得不可用或者响应很慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。熔断机制:熔断机制是应对服务雪崩效应的一种微服务链路保护机制。当删除链路的某个微服务出错不可用时或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息。当检测到该节点微服务调用恢复正常时,又会自动恢复调用链路。(这就是他的nb之处)在SpringCloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务之间调用的关系,当失败的次数达到设置的阈值,默认是5秒内20次失败,就会开启熔断机制。熔断机制的注解还是@HystrixCommand。服务限流例如在高并发的情况下,秒杀场景,严禁一窝蜂请求全部过来,需要排队。一般限制的指标有:请求总量或某段时间内请求总量。超时服务器变慢如何解决?超时不再等待。宕机或者程序运行出错:有默认的处理方式服务提供者超时了,调用者不能一直卡死等待,必须有服务降级;服务提供方宕机了,调用者不能一直卡死,也必须有服务降级。对方服务帧长,调用者这时有故障,可以设置自己的等待时间小于服务提供者。
2025年04月03日
0 阅读
0 评论
0 点赞
2025-04-03
让@Value注解生效
继承 WebMvcConfigurer 接口 重写 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authCheckHandler); WebMvcConfigurer.super.addInterceptors(registry); }
2025年04月03日
1 阅读
0 评论
0 点赞
1
...
3
4
5
...
54