SpringBoot+SpringSecurity+thymeleaf 代码实现

SpringBoot+SpringSecurity+thymeleaf 代码实现

最近这两天在学习spring security 学的心累的不要不要的,终于在今天让我成功的写了一个成功案例,开心。

并且在学习的过程中找到了一个springsecurity4官方文档的中文版,写的非常棒(个人感觉) 传送门:没错我就是传送门

放代码之前说下环境:
1.开发工具 idea
2.项目集成工具 gradle 2.0
3.数据库 MySQL5.6
4.框架(只说了主要的):springboot-2.0 ;springsecurity-5.0

以下是主要代码:

MySQL数据库连接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
登陆页面

在登陆页面中用户名必须是username,密码必须是password,提交的路径必须是/login,方式必须是post。 当你post请求/login时就会进入到spring security的验证方法中

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
      layout:decorator="layout">
<head><title>Login Page</title></head>
<body onload='document.f.username.focus();'>
<h3>登陆</h3>
<form name='f' action="/login" th:action="@{/login}" th:method='POST'>
    <table>
        <tr>
            <td>User:</td>
            <td><input type='text' name='username' value=''></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type='password' name='password'/></td>
        </tr>
        <tr>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,演示如何使用Spring Security实现动态分配菜单权限和数据权限。在本示例中,我们假设您已经创建了一个名为“menu”和一个名为“role”的数据库表。 首先,您需要定义菜单和角色的实体类: ```java @Entity @Table(name = "menu") public class Menu { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String url; private String icon; private Long parentId; // getter and setter } @Entity @Table(name = "role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; private String menus; // 存储菜单ID的字符串,以逗号分隔 // getter and setter } ``` 然后,您需要为这些实体类创建相应的Repository接口: ```java public interface MenuRepository extends JpaRepository<Menu, Long> { } public interface RoleRepository extends JpaRepository<Role, Long> { } ``` 接下来,您需要在Spring Security中配置角色和权限: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .anyRequest().authenticated() .and().formLogin().loginPage("/login").permitAll() .and().logout().logoutUrl("/logout").permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 在上述配置中,我们定义了两个角色:“ADMIN”和“USER”,并将其与不同的资源进行关联。例如,只有拥有“ADMIN”角色的用户才能访问“/admin/**”路径。 接下来,您需要实现自定义的UserDetailsService类,以根据用户的角色动态生成菜单: ```java @Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Autowired private RoleRepository roleRepository; @Autowired private MenuRepository menuRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found with username: " + username); } List<GrantedAuthority> authorities = new ArrayList<>(); String[] roles = user.getRoles().split(","); for (String roleName : roles) { Role role = roleRepository.findByName(roleName); if (role != null) { authorities.add(new SimpleGrantedAuthority(role.getName())); } String[] menuIds = role.getMenus().split(","); for (String menuId : menuIds) { Menu menu = menuRepository.findById(Long.parseLong(menuId)).orElse(null); if (menu != null) { // 生成菜单 } } } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities); } } ``` 在上述代码中,我们首先获取用户所拥有的角色,然后根据角色获取对应的菜单。最后,我们将这些菜单生成为动态菜单,以供用户访问。 最后,您可以使用Spring Data JPA和Thymeleaf等技术实现动态生成菜单的功能。例如: ```html <ul class="sidebar-menu"> <li th:each="menu : ${menus}" th:class="${menu.parentId == null ? 'treeview' : ''}"> <a th:href="@{${menu.url}}"> <i th:class="${menu.icon}"></i> <span th:text="${menu.name}"></span> <i th:if="${menu.children.size() > 0}" class="fa fa-angle-left pull-right"></i> </a> <ul th:if="${menu.children.size() > 0}" class="treeview-menu"> <li th:each="child : ${menu.children}"> <a th:href="@{${child.url}}"> <i th:class="${child.icon}"></i> <span th:text="${child.name}"></span> </a> </li> </ul> </li> </ul> ``` 上述代码将根据用户所拥有的菜单动态生成侧边栏菜单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值