以用户登录为例采用Spring Security实现权限控制

(最新Java面试资料包:链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g)
一、为什么需要权限控制?
用户登录是权限控制的第一道关卡。像电商、OA这些系统必须区分普通用户、VIP用户和管理员,Spring Security通过过滤器链机制,帮我们自动拦截未授权请求。这里有个坑要注意:权限粒度,粗粒度控制接口访问,细粒度控制按钮显示,两者要配合使用。
二、Spring Security基础配置
- 引入依赖:在pom.xml加spring-boot-starter-security,注意版本和Spring Boot匹配
- 配置白名单:静态资源和登录页必须放行,比如
/login.html、/css/** - 密码加密:BCryptPasswordEncoder是标配,千万别用MD5存密码
- 记住我功能:用持久化token方案,数据库要存series和token值

(实战小技巧:遇到403错误先检查角色前缀,默认是ROLE_开头)
三、用户登录流程设计
- 自定义UserDetailsService
从数据库查用户信息,重点处理用户不存在、密码错误、账号冻结三种异常,Spring Security会自动跳转到登录失败页。 - 登录成功处理
重定向到首页时记得清空认证请求缓存,否则可能被攻击者利用。 - 前后端分离方案
把Session改成JWT的话,要重写UsernamePasswordAuthenticationFilter,返回JSON格式的登录结果。
四、权限控制核心实现
- 注解方式
@PreAuthorize("hasRole('ADMIN')")最常用,注意要在配置类开启动态注解@EnableGlobalMethodSecurity(prePostEnabled = true) - 动态权限方案
实现FilterInvocationSecurityMetadataSource接口,从数据库读取URL-角色映射关系,适合权限经常变动的系统 - 页面元素控制
用Thymeleaf的sec:authorize属性隐藏按钮,注意要和后端权限校验做双重验证

(技术福利:需要购买面试鸭会员的同学,通过面试鸭返利网下单可返25元,实测到账快)
五、安全防护与扩展技巧
- 防止CSRF攻击
表单必须带_csrf参数,REST API可以禁用CSRF保护 - 会话管理
设置最大会话数、踢人功能,关键操作要二次认证 - OAuth2整合
用spring-security-oauth2-client接第三方登录,注意redirect_uri必须全匹配
最后推荐个神器:用SecurityFilterChain替代旧版WebSecurityConfigurerAdapter,配置更灵活。权限这块常考的点还有权限继承和动态角色,建议准备好两个以上落地案例。
更多面试真题解析,访问面试鸭返利网获取全套备战方案,包含高频考点脑图+项目难点解析。现在下单会员还能用返利抵扣,相当于白嫖学习资源!


