今天跟大家唠唠我捣鼓的这个“千面郎君”项目,说白了,就是想搞一个能根据不同用户展示不同界面和功能的玩意儿。 别看名字挺唬人,整个过程磕磕绊绊,踩了不少坑。
我就寻思着,这玩意儿的核心得是个灵活的权限系统。我先调研了一圈,发现市面上现成的方案要么太重,要么不够灵活,索性决定自己撸一个。
第一步:搭框架
我选了Spring Boot作为基础框架,这玩意儿用着顺手,而且社区资源多,遇到问题也好找答案。然后,引入了MyBatis Plus,操作数据库方便,省去了写大量重复的SQL代码。
第二步:设计数据表
这个很重要!权限系统的数据表设计直接关系到后续功能的实现。我设计了用户表、角色表、权限表、用户角色关联表、角色权限关联表这几个核心表。
用户表 (user):记录用户基本信息,比如用户名、密码、邮箱啥的。
角色表 (role):定义不同的角色,比如管理员、普通用户、VIP用户等。
权限表 (permission):定义具体的权限,比如查看文章、编辑文章、删除文章等。
用户角色关联表 (user_role):建立用户和角色之间的关系,一个用户可以拥有多个角色。
角色权限关联表 (role_permission):建立角色和权限之间的关系,一个角色可以拥有多个权限。
第三步:实现权限验证
这块是重头戏。我采用了基于角色的访问控制(RBAC)模型。简单来说,就是先判断用户是否拥有某个角色,然后判断该角色是否拥有某个权限。
我用了Spring Security来实现权限验证。自定义了一个UserDetailsService,用于从数据库中加载用户信息。然后,配置了Spring Security的FilterChain,拦截所有请求,进行权限验证。
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/").hasRole("ADMIN") // 只有ADMIN角色可以访问/admin/
.antMatchers("/user/").hasAnyRole("ADMIN", "USER") // ADMIN和USER角色可以访问/user/
.anyRequest().permitAll() // 其他请求允许匿名访问
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
*(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
这段代码的意思是,` /admin/` 路径下的资源只有拥有 `ADMIN` 角色的用户才能访问,`/user/` 路径下的资源 `ADMIN` 和 `USER` 角色都可以访问,其他路径的资源允许匿名访问。
第四步:动态界面展示
有了权限控制,接下来就是根据用户的角色,动态展示不同的界面。我用了Thymeleaf模板引擎来实现这个功能。Thymeleaf可以根据用户的角色,动态渲染不同的HTML代码。
比如,如果用户是管理员,就显示管理后台的菜单;如果用户是普通用户,就只显示普通用户的菜单。
第五步:踩坑记录
数据库连接问题:我用的MySQL 5.7,结果在配置数据库连接的时候,一直报时区错误。后来查了半天资料,发现是MySQL 5.7的默认时区配置有问题,需要在连接URL中指定时区。
Spring Security配置问题:Spring Security的配置比较繁琐,一不小心就容易出错。我一开始在配置FilterChain的时候,把permitAll()放在了前面,导致所有的请求都被放行了,权限验证失效。
Thymeleaf渲染问题:Thymeleaf的语法比较灵活,但是也容易出错。我一开始在使用Thymeleaf的条件判断语句的时候,总是写错,导致界面渲染不正确。
总结一下
这个“千面郎君”项目虽然简单,但是涉及到的技术点还挺多,包括权限系统设计、Spring Boot、Spring Security、MyBatis Plus、Thymeleaf等。在开发过程中,遇到了不少问题,也学到了很多东西。
最重要的一点是,要多看文档,多查资料,多尝试。遇到问题不要怕,Google一下,总能找到答案的。
希望我的这回实践记录能对大家有所帮助。如果有什么问题,欢迎在评论区留言交流。
还没有评论,来说两句吧...