0


后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」:

★java一站式服务 ★
★前端炫酷代码分享
★★ uniapp-从构建到提升★
★ 从0到英雄,vue成神之路★
★ 解决算法,一个专栏就够了★
★ 架构咱们从0说★
★ 数据流通的精妙之道★

★后端进阶之路★

请添加图片描述

文章目录

在这里插入图片描述

1. 自定义认证和授权逻辑

在Spring Security中,我们可以自定义认证和授权逻辑来满足特定的需求。以下是两种常见的方法:

1.1 实现自定义的UserDetailsService接口

通过实现自定义的UserDetailsService接口,我们可以从数据库、LDAP或其他数据源中加载用户信息并进行认证。

@ServicepublicclassCustomUserDetailsServiceimplementsUserDetailsService{@AutowiredprivateUserRepository userRepository;@OverridepublicUserDetailsloadUserByUsername(String username)throwsUsernameNotFoundException{User user = userRepository.findByUsername(username);if(user ==null){thrownewUsernameNotFoundException("User not found with username: "+ username);}// 构建UserDetails对象并返回(通常使用User实体类的实例)returnneworg.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                user.isEnabled(), user.isAccountNonExpired(), user.isCredentialsNonExpired(),
                user.isAccountNonLocked(), user.getAuthorities());}}

上述代码中,我们使用自定义的UserRepository从数据库中获取用户实体对象,并构建一个实现UserDetails接口的UserDetails对象。

1.2 扩展AbstractSecurityInterceptor类以自定义访问控制

通过扩展AbstractSecurityInterceptor类,我们可以实现基于自定义表达式的访问控制逻辑。

publicclassCustomSecurityInterceptorextendsAbstractSecurityInterceptorimplementsFilter{// 通过注入自定义的AccessDecisionManager和AuthenticationManager实现类@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,ServletException{HttpServletRequest httpRequest =(HttpServletRequest) request;HttpServletResponse httpResponse =(HttpServletResponse) response;// 创建FilterInvocation对象,表示当前过滤器链的调用FilterInvocation filterInvocation =newFilterInvocation(httpRequest, httpResponse, chain);// 执行授权过程invoke(filterInvocation);}@OverridepublicClass<?>getSecureObjectClass(){returnFilterInvocation.class;}@OverridepublicSecurityMetadataSourceobtainSecurityMetadataSource(){returnnull;}// 调用AccessDecisionManager执行访问控制逻辑@Overridepublicvoidinvoke(FilterInvocation fi)throwsIOException,ServletException{InterceptorStatusToken token =super.beforeInvocation(fi);try{// 执行下一个拦截器
            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());}finally{super.afterInvocation(token,null);}}}

上述代码中,我们通过扩展AbstractSecurityInterceptor类,并实现其相关方法,来自定义访问控制的逻辑。其中,invoke方法用于执行访问控制的逻辑,并调用AccessDecisionManager进行访问决策。

2. Spring Security注解

Spring Security提供了一系列注解,用于在代码中进行细粒度的权限控制和安全保护。以下是常用的注解及其作用:

@PreAuthorize

@PreAuthorize

注解用于在方法执行之前对方法的调用进行权限验证。

@PreAuthorize("hasRole('ROLE_ADMIN')")publicvoidadminOnlyMethod(){// 只有具有ROLE_ADMIN角色的用户才能执行该方法}

上述代码中,只有具有

ROLE_ADMIN

角色的用户才能成功调用

adminOnlyMethod()

方法。

@PostAuthorize

@PostAuthorize

注解用于在方法执行之后对方法的返回值进行权限验证。

@PostAuthorize("returnObject.author == principal.username")publicBookgetBook(String bookId){// 根据bookId获取书籍对象,并返回}

上述代码中,

getBook()

方法返回的Book对象将被验证,只有当Book对象的author与当前登录用户的用户名相同时,才能成功返回。

@Secured

@Secured

注解用于对方法进行角色验证。

@Secured("ROLE_ADMIN")publicvoidadminOnlyMethod(){// 只有具有ROLE_ADMIN角色的用户才能执行该方法}

上述代码中,只有具有

ROLE_ADMIN

角色的用户才能成功调用

adminOnlyMethod()

方法。

@PreFilter

@PreFilter

注解用于在方法执行之前对方法的参数进行过滤,并对满足条件的参数进行权限验证。

@PreFilter("hasRole('ROLE_ADMIN') or filterObject.userId == principal.username")publicvoidupdateUserInfo(List<User> userList){// 根据userId更新用户信息}

上述代码中,

updateUserInfo()

方法的

userList

参数将被过滤,只有其中的元素满足

hasRole('ROLE_ADMIN') or filterObject.userId == principal.username

条件才能执行相应操作。

5. 总结

综上所述,SpringSecurity提供了灵活的机制来自定义认证和授权逻辑,并通过注解提供了便捷的方式来实现细粒度的权限控制。结合这些功能,我们可以构建安全可靠的应用程序。
在这里插入图片描述

标签: spring java 后端

本文转载自: https://blog.csdn.net/Why_does_it_work/article/details/132110037
版权归原作者 雪碧有白泡泡 所有, 如有侵权,请联系我们删除。

“后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)”的评论:

还没有评论