我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么理解Spring Boot认证和鉴权

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么理解Spring Boot认证和鉴权

本篇内容介绍了“怎么理解Spring Boot认证和鉴权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在web应用中有大量场景需要对用户进行安全校,一般人的做法就是硬编码的方式直接埋到到业务代码中,但可曾想过这样做法会导致代码不够简洁(大量重复代码)、有个性化时难维护(每个业务逻辑访问控制策略都不相同甚至差异很大)、容易发生安全泄露(有些业务可能不需要当前登录信息,但被访问的数据可能是敏感数据由于遗忘而没有受到保护)。

为了更安全、更方便的进行访问安全控制,我们可以想到的就是使用springmvc的拦截器(HandlerInterceptor),但其实更推荐使用更为成熟的spring security来完成认证和鉴权。

拦截器

拦截器HandlerInterceptor确实可以帮我们完成登录拦截、或是权限校验、或是防重复提交等需求。其实基于它也可以实现基于url或方法级的安全控制。

如果你对spring mvc的请求处理流程相对的了解,它的原理容易理解,具体可以参阅我之前的分享。

public interface HandlerInterceptor {boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;}//你可以基于有些url进行拦截@Configurationpublic class UserSecurityInterceptor extends WebMvcConfigurerAdapter {    @Override    public void addInterceptors(InterceptorRegistry registry) {        String[] securityUrls = new String[]{"esbdictionary    @Bean    public HttpFirewall allowUrlEncodedSlashHttpFirewall() {        DefaultHttpFirewall firewall = new DefaultHttpFirewall();        firewall.setAllowUrlEncodedSlash(true);        return firewall;    }     @Bean    public AuthInterceptor userLoginInterceptor() {        return new AuthInterceptor();    }     public class AuthInterceptor implements HandlerInterceptor {        public Logger logger = LoggerFactory.getLogger(AuthInterceptor.class);        @Autowired        private ApplicationContext applicationContext;         public AuthInterceptor() {        }         @Override        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {            LoginUserInfo user = null;            try {                user = (LoginUserInfo) SSOUserUtils.getCurrentLoginUser();            } catch (Exception e) {                logger.error("从SSO登录信息中获取用户信息失败! 详细错误信息:%s", e);                throw new ServletException("从SSO登录信息中获取用户信息失败!", e);            }             String[] profiles = applicationContext.getEnvironment().getActiveProfiles();            if (!Arrays.isNullOrEmpty(profiles)) {                if ("dev".equals(profiles[0])) {                    return true;                }            }            if (user == null || UserUtils.ANONYMOUS_ROLE_ID.equals(user.getRoleId())) {                throw new ServletException("获取登录用户信息失败!");            }            return true;        }         @Override        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {         }         @Override        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {         }    }}

认证

确认一个访问请求发起的时候背后的用户是谁,他的用户信息是怎样的。在spring security 里面认证支持很多种方式,最简单的就是用户名密码,还有LDAP、OpenID、CAS等等。

而在我们的系统里面,用户信息需要通过kxtx-sso模块进行获取。通过sso认证比较简单,就是要确认用户是否通过会员系统登录,并把登录信息包装成授权对象放到SecurityContext中,通过一个filter来完成:

@Data@EqualsAndHashCode(callSuper = false)public class SsoAuthentication extends AbstractAuthenticationToken {    private static final long serialVersionUID = -1799455508626725119L;     private LoginUserInfo user;     public SsoAuthentication(LoginUserInfo user) {        super(null);        this.user = user;    }     @Override    public Object getCredentials() {        return "kxsso";    }     @Override    public Object getPrincipal() {        return user;    }     @Override    public String getName() {        return user.getName();    }}public class SsoAuthenticationProcessingFilter extends OncePerRequestFilter {    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        LoginUserInfo user = (LoginUserInfo) SSOUserUtils.getCurrentLoginUser();        SsoAuthentication auth = new SsoAuthentication(user );        SecurityContextHolder.getContext().setAuthentication(auth);        filterChain.doFilter(request, response);    }}@Componentpublic class SsoAuthenticationProvider implements AuthenticationProvider {     @Value("${env}")    String env;     @Override    public Authentication authenticate(Authentication authentication) throws AuthenticationException {        LoginUserInfo loginUserInfo = (LoginUserInfo) authentication.getPrincipal();                if (!UserUtils.ANONYMOUS_ROLE_ID.equals(loginUserInfo.getRoleId()) || "dev".equals(env)) {            authentication.setAuthenticated(true);        } else {            throw new BadCredentialsException("请登录");        }        return authentication;    }     @Override    public boolean supports(Class<?> authentication) {        return SsoAuthentication.class.equals(authentication);    }}@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)public class WebSecurityConfig extends WebSecurityConfigurerAdapter {     protected void configure(HttpSecurity http) throws Exception {        // 关闭session        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and();         // 允许访问所有URL,通过方法保护的形式来限制访问。        http.authorizeRequests().anyRequest().permitAll();         // 注册sso filter        http.addFilterBefore(ssoAuthenticationProcessingFilter(), UsernamePasswordAuthenticationFilter.class);    }     @Bean    SsoAuthenticationProcessingFilter ssoAuthenticationProcessingFilter() {        return new SsoAuthenticationProcessingFilter();    }}

鉴权

控制一个功能是否能被当前用户访问,对不符合要求的用户予以拒绝。spring security 主要有两种控制点:

  • 基于请求路径的:控制某一URL模式必须符合某种要求;

  • 基于方法的:控制某一方法必须符合某种要求;

而控制形式就比较多样化了:

  • 代码配置;

  • xml配置;

  • 注解控制;

  • el表达式;

  • 自定义访问控制器;

目前鉴权的需求比较简单:登录允许访问,未登录禁止访问。因此可以定义了一个切面,控制所有需要安全控制的Controller。

spring security 提供了一些注解:

@PreAuthorize

控制一个方法是否能够被调用,业务方法(HandlerMethod )的前置处理,比如:

@PreAuthorize("#id<10")限制只能查询Id小于10的用户

@PreAuthorize("principal.username.equals(#username)")限制只能查询自己的信息

@PreAuthorize("#user.name.equals('abc')")限制只能新增用户名称为abc的用户

@PostAuthorize

业务方法调用完之后进行权限检查,后置处理,比如:

@PostAuthorize("returnObject.id%2==0")

public User find(int id) {}

返回值的id是偶数则表示校验通过,否则表示校验失败,将抛出AccessDeniedException

@PreFilter

对集合类型的参数进行过滤,比如:

对集合ids中id不为偶数的进行移除 @PreFilter(filterTarget="ids", value="filterObject%2==0") public void delete(List<Integer> ids, List<String> usernames) {}

@PostFilter

对集合类型的返回值进行过滤,比如:

将对返回结果中id不为偶数的list中的对象进行移除

@PostFilter("filterObject.id%2==0") public List<User> findAll() {}

@AuthenticationPrincipal解决在业务方法内对当前用户信息的方法
@Aspect@Componentpublic class InControllerAspect {    @Autowired    BeforeInControllerMethods beforeInMethods;     @Pointcut("execution(public * com.kxtx.oms.portal.controller.in.*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")    public void hp() {    };     @Before("hp()")    public void befor() {        beforeInMethods.before();    }}@Componentpublic class BeforeInControllerMethods {    //@PreAuthorize("authenticated")要求所有访问此方法的用户必须登录    @PreAuthorize("authenticated")    public void before() {    }}//用户信息获取@RequestMapping("/order/submit")public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser) {    // .. find messages for this user and return them ...}

是不是有点复杂,复杂的是表现形式,实际上需要真正理解它的目的(为了要解决什么问题)。

“怎么理解Spring Boot认证和鉴权”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么理解Spring Boot认证和鉴权

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么理解Spring Boot认证和鉴权

本篇内容介绍了“怎么理解Spring Boot认证和鉴权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在web应用中有大量场景需要对用户进行
2023-06-25

Spring Boot怎么实现通用Auth认证

这篇文章主要介绍“Spring Boot怎么实现通用Auth认证”,在日常操作中,相信很多人在Spring Boot怎么实现通用Auth认证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring Boot
2023-06-29

k8s中各组件和kube apiserver通信时的认证和鉴权问题怎么解决

这篇文章主要介绍“k8s中各组件和kube apiserver通信时的认证和鉴权问题怎么解决”,在日常操作中,相信很多人在k8s中各组件和kube apiserver通信时的认证和鉴权问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简
2023-07-02

Spring Boot怎么集成JWT实现前后端认证

本文小编为大家详细介绍“Spring Boot怎么集成JWT实现前后端认证”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot怎么集成JWT实现前后端认证”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
2023-06-30

SpringBoot中怎么实现安全认证和授权

在Spring Boot中,可以使用Spring Security实现安全认证和授权。Spring Security是一个强大且高度可定制的框架,可以帮助我们轻松地实现各种安全功能,包括用户认证、用户授权、密码加密、会话管理等。以下是在S
SpringBoot中怎么实现安全认证和授权
2024-03-07

.NET Core怎么实现Cookie和JWT混合认证、授权

本篇内容介绍了“.NET Core怎么实现Cookie和JWT混合认证、授权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言为防止JWT
2023-06-26

ASP.NET Core 6.0怎么添加JWT认证和授权功能

本篇内容介绍了“ASP.NET Core 6.0怎么添加JWT认证和授权功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!相关名词Authe
2023-06-30

MongoDB的权限管理与用户认证怎么实现

MongoDB的权限管理和用户认证是通过创建用户和设置角色来实现的。下面是MongoDB权限管理和用户认证的步骤:创建管理员用户:首先,在MongoDB中创建一个管理员用户,用于管理数据库的用户和角色。创建普通用户:使用管理员用户登录Mon
MongoDB的权限管理与用户认证怎么实现
2024-05-07

如何解决PHP开发中的安全认证和权限管理

随着互联网的发展,Web应用程序的安全性变得越来越重要。在PHP开发中,安全认证和权限管理是必不可少的。本文将介绍如何解决PHP开发中的安全认证和权限管理,并提供具体的代码示例。一、安全认证(Authentication)安全认证是验证用户
2023-10-21

如何使用Python实现对ElasticSearch的安全认证和权限管理?(在Python中,怎样进行ElasticSearch的安全认证和权限设置?)

在Python中实现Elasticsearch安全认证和权限管理涉及以下步骤:创建用户,设置密码和角色。创建角色,指定索引权限。将角色与用户关联。启用安全。启用TLS以加密通信。使用用户名和密码进行身份验证。检查用户权限。最佳实践包括使用强密码、定期轮换密码、创建多个角色和限制特权访问。遵循这些步骤可确保Elasticsearch集群免受未经授权的访问和安全威胁。
如何使用Python实现对ElasticSearch的安全认证和权限管理?(在Python中,怎样进行ElasticSearch的安全认证和权限设置?)
2024-04-02

Postman怎么处理身份验证和授权

在Postman中,处理身份验证和授权可以通过以下步骤进行:打开Postman应用程序并创建一个新的请求。在请求的Headers部分中,添加一个Authorization头。在这里,您可以选择不同的身份验证类型,如Basic Auth、Be
Postman怎么处理身份验证和授权
2024-03-13

使用vue怎么实现身份认证管理和租户管理功能

本篇文章为大家展示了使用vue怎么实现身份认证管理和租户管理功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。按钮级权限src\utils\abp.js:export function checkP
2023-06-15

在Go语言中如何解决并发网络请求的请求认证和授权处理问题?

在Go语言中如何解决并发网络请求的请求认证和授权处理问题?随着互联网的高速发展,网络请求在我们的日常开发中扮演着非常重要的角色。然而,随着系统规模的扩大和并发量的增加,请求认证和授权问题也逐渐变得复杂起来。在这篇文章中,我们将探讨在Go语言
2023-10-22

在Spring Boot中统一Restful API返回值格式与统一处理异常怎么解决

这篇文章主要为大家分析了在Spring Boot中统一Restful API返回值格式与统一处理异常怎么解决的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“在
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录