spring security 授予权限_SpringBoot整合权限控制框架Spring Security

通常我们的网站都有权限控制,就像一个公司有产品、开发、运维之分,各自负责各自的业务,相互独立,有相互协作,共同完成一个任务。拥有不同权限的用户查看不同的页面,进行不同的操作。

这篇来简单的说一下使用springboot+jpa+springsecurity实现简单的用户权限管理。

角色和用户的关系通过数据库配置控制。角色可以访问的权限通过硬编码控制。

springboot是一个灵活和强大的身份验证和访问控制框架,以确保基于spring的java web应用程序的安全。它与spring mvc有很好地集成,并配备了流行的安全算法实现捆绑在一起。

1)    springscurity验证用户密码机制

1357d3417f03044676dc48c87e1d02e7.png

首先在usernamePasswordAuthenticationFilter中来拦截登录请求,并调用AuthenticationManager。AuthenticationManager调用Provider,provider调用userDetaisService来根据username获取真实的数据库信息。 

2) 数据库设计

主要包括:用户表、角色表、用户关系表。

76ec134202314078e5aec2c0a8d737a1.png

3) 添加spring security的maven依赖

   org.springframework.boot   spring-boot-starter-security

4)编写实体

User.java实现UserDetails接口,通过getAuthorities获取用户的角色。

package com.xiaoi.document.split.security.user.entity;import com.xiaoi.document.split.security.role.entity.Role;import lombok.ToString;import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.userdetails.UserDetails;import javax.persistence.*;import java.util.Collection;import java.util.List;@Entity@Table(name = "sys_user")@Cacheable@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache")@ToString(includeFieldNames = true)public class User implements UserDetails {@Id    @GeneratedValue    @Column(name = "id")private String id;    @Column(name = "username")private String username;    @Column(name = "password")private String password;    @ManyToMany(targetEntity = Role.class, cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)@JoinTable(name = "sys_role_user", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))private Listroles;    public User() {
}public User(String id, String username, String password) {this.id = id; this.username = username; this.password = password; }public String getId() {return id; }public void setId(String id) {this.id = id; }public String getUsername() {return username; }public void setUsername(String username) {this.username = username; }public String getPassword() {return password; }public void setPassword(String password) {this.password = password; }public ListgetRoles() {return roles; }public void setRoles(List roles) {this.roles = roles; }@Override public Collection extends GrantedAuthority> getAuthorities() {return roles; }@Override public boolean isAccountNonExpired() {return true; }@Override public boolean isAccountNonLocked() {return true; }@Override public boolean isCredentialsNonExpired() {return true; }@Override public boolean isEnabled() {return true; }
}

role.java

package com.xiaoi.document.split.security.role.entity;import com.xiaoi.document.split.security.permission.entity.Permission;import com.xiaoi.document.split.security.user.entity.User;import lombok.ToString;import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;import org.hibernate.annotations.ManyToAny;import org.springframework.security.core.GrantedAuthority;import javax.persistence.*;import java.util.List;@Entity@Table(name = "sys_role")@Cacheable@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache")@ToString(includeFieldNames = true)public class Role implements GrantedAuthority {@Id    @GeneratedValue    @Column(name = "id")private String id;    @Column(name = "name")private String name;    @ManyToMany(targetEntity = Permission.class, cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)@JoinTable(name = "sys_permission_role", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "permission_id", referencedColumnName = "id"))private Listpermissions;    public Role() {
}public String getId() {return id; }public void setId(String id) {this.id = id; }public String getName() {return name; }public void setName(String name) {this.name = name; }public ListgetPermissions() {return permissions; }public void setPermissions(List permissions) {this.permissions = permissions; }@Override public String getAuthority() {return name; }
}

5) 自定义用户验证service

UserDAO.java

package com.xiaoi.document.split.security.user.service.impl;import com.xiaoi.document.split.security.user.dao.UserDAO;import com.xiaoi.document.split.security.user.entity.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.stereotype.Service;@Service(value = "customerUserService")public class CustomerUserService implements UserDetailsService {@Autowired    private UserDAO userDAO;    @Override    public UserDetails loadUserByUsername(String username) {
User user = userDAO.findByUsername(username); if (user == null) {throw new UsernameNotFoundException("用户名不存在"); }
String pwd = new BCryptPasswordEncoder().encode(user.getPassword()); user.setPassword(pwd); return user; }
}

CustomerService.java

package com.xiaoi.document.split.security.user.service.impl;import com.xiaoi.document.split.security.user.dao.UserDAO;import com.xiaoi.document.split.security.user.entity.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.stereotype.Service;@Service(value = "customerUserService")public class CustomerUserService implements UserDetailsService {@Autowired    private UserDAO userDAO;    @Override    public UserDetails loadUserByUsername(String username) {
User user = userDAO.findByUsername(username); if (user == null) {throw new UsernameNotFoundException("用户名不存在"); }
String pwd = new BCryptPasswordEncoder().encode(user.getPassword()); user.setPassword(pwd); return user; }
}

controller

package com.xiaoi.document.split.security.home.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;/** * Created by Administrator on 2018/5/24. */@Controllerpublic class HomeCotroller {//    @RequestMapping(value = "/", method = RequestMethod.GET)//    String home() {//        return "login";//    }////    @RequestMapping(value = "/login", method = RequestMethod.GET)//    String login() {//        return "login";//    }//    @RequestMapping(value = "/welcome", method = RequestMethod.GET)//    String welcome() {//        return "welcome";//    }//    @RequestMapping(value = "/loginSubmit", method = RequestMethod.GET)//    String loginSubmit(Model model, User user) {//        model.addAttribute("user", user);//        return "index";//    }    @RequestMapping("/index")public String index(Model model) {//        Msg msg =  new Msg("测试标题","测试内容","欢迎来到HOME页面,您拥有 ROLE_ADMIN 权限");//        model.addAttribute("msg", msg);        return "index";    }@RequestMapping("/admin")@ResponseBody    public String hello() {return "hello admin";    }
}

6) 添加视图,配置安全策略

package com.xiaoi.document.split.security.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * WebMvcConfig 页面访问安全配置 * * @Author Yuan Jingshan * @Date 2018-05-29 */@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {@Override    public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login"); }
}
package com.xiaoi.document.split.security.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.builders.WebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;/** * WebMvcSecurityConfig 页面访问安全配置 * * @Author Yuan Jingshan * @Date 2018-05-29 */@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowired    private AuthorizationSecurityInterceptor authorizationSecurityInterceptor;    //注册UserDetailsService的bean    @Autowired    UserDetailsService customerUserService;    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customerUserService).passwordEncoder(new BCryptPasswordEncoder()); }//安全策略 @Override protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/register", "/reg", "/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.defaultSuccessUrl("/index")
.permitAll()
.and()
.logout()
.permitAll(); http.addFilterBefore(authorizationSecurityInterceptor, FilterSecurityInterceptor.class); }//解决静态资源被拦截的问题 @Override public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**"); web.ignoring().antMatchers("/img/**"); web.ignoring().antMatchers("/plugins/**"); }
}

7)前端页面

login.html

/span>html>xmlns:th="http://www.thymeleaf.org">    charset="utf-8"/>    name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> springboot-demo rel="Shortcut Icon" href="/img/logo_m.png" type="image/x-icon"> rel="stylesheet" th:href="@{plugins/layui/css/layui.css}"> rel="stylesheet" th:href="@{css/style.css}">class="login">
class="layui-layout">
class="layui-body">
class="layui-row" style="margin-top: 5%;margin-bottom: 5%;">
class="layui-col-md7" style="border-bottom: 2px solid white;margin-right: 2%;letter-spacing:2px;float: right;">
class="project_name"> src="/img/logo_l.png"/> QA对知识拆分管理系统
class="layui-row">
class="layui-col-md3 layui-col-md-offset8">
class="layui-input-block" style="text-align: center;line-height: 38px;background-color: #f79647;margin-bottom:5px;font-weight: 800;color: white;letter-spacing:5px;border-radius:5px"> 用户登录
class="layui-form" th:action="@{/login}" action="/login" method="POST" style="background-color: white;padding: 10px 10px;border-radius:5px">
class="layui-form-item" style="margin-top: 10px;background-color: white;">
class="layui-input-block"> type="text" id="username" name="username" lay-verify="title" autocomplete="off" placeholder="请输入用户名" class="layui-input">
class="layui-form-item">
class="layui-input-block"> type="password" id="password" name="password" lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
id="login_div" class="layui-form-item">
class="layui-input-block">

th:if="${param.logout}" class="bg-warning">已成功注销

th:if="${param.error}" class="bg-danger">有错误,请重试

class="layui-btn" lay-submit lay-filter="formDemo">登录
class="layui-footer"> © 贵州小爱机器人科技有限公司
     xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

恭喜您,您有 ROLE_USER 权限

出处:CSDN

https://blog.csdn.net/likeyjs/article/details/80525042
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot和Spring Security是一对好朋友,Spring Boot提供了强大的自动配置和快速开发的能力,而Spring Security则提供了完整的安全解决方案,可以实现用户认证、授权、安全过滤等功能。本文将介绍如何在Spring Boot中整合Spring Security实现权限控制。 1. 添加Spring Security依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 配置Spring SecuritySpring Boot中,可以通过application.properties或application.yml文件配置Spring Security。以下是一个简单的配置: ``` spring.security.user.name=admin spring.security.user.password=123456 spring.security.user.roles=ADMIN ``` 这个配置定义了一个用户名为admin,密码为123456,角色为ADMIN的用户。在实际应用中,应该将用户名和密码存储在数据库或其他安全存储中。 3. 创建SecurityConfig类 创建一个继承自WebSecurityConfigurerAdapter的SecurityConfig类,并重写configure方法: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("{noop}123456").roles("ADMIN"); } } ``` configure方法定义了应用程序的安全策略,这里配置了所有请求都需要认证(即登录)才能访问,除了首页和登录页,这两个页面可以匿名访问。formLogin方法配置了自定义的登录页面,logout方法配置了退出登录的操作。 configureGlobal方法定义了一个内存中的用户,用户名为admin,密码为123456,角色为ADMIN。在实际应用中,应该将用户信息存储在数据库或其他安全存储中。 4. 创建登录页面 在templates目录下创建一个名为login.html的登录页面,例如: ``` <!DOCTYPE html> <html> <head> <title>Login Page</title> </head> <body> <h1>Login Page</h1> <div th:if="${param.error}"> Invalid username and password. </div> <div th:if="${param.logout}"> You have been logged out. </div> <form th:action="@{/login}" method="post"> <div> <label>Username:</label> <input type="text" name="username" /> </div> <div> <label>Password:</label> <input type="password" name="password" /> </div> <div> <button type="submit">Login</button> </div> </form> </body> </html> ``` 5. 运行应用程序 在浏览器中访问http://localhost:8080/login,输入用户名admin和密码123456,即可登录成功。如果输入错误的用户名或密码,则会提示“Invalid username and password.”。如果成功登录后再访问http://localhost:8080/home,则可以看到“Welcome home!”的欢迎消息。 6. 实现权限控制 上面的例子中只实现了登录认证,没有实现权限控制。下面介绍如何实现权限控制。 首先需要在configureGlobal方法中添加更多的用户和角色: ``` @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("{noop}123456").roles("ADMIN") .and() .withUser("user").password("{noop}password").roles("USER"); } ``` 这里定义了一个管理员用户和一个普通用户,分别拥有ADMIN和USER两个角色。 然后在configure方法中添加更多的安全策略: ``` @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } ``` 这里添加了一个安全策略,即/admin/**路径需要拥有ADMIN角色才能访问。 现在管理员用户可以访问/admin/**路径,而普通用户则不能访问。如果普通用户尝试访问/admin/**路径,则会提示“Access is denied”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值