springboot11-security02FromDB 权限管理(用户信息和角色信息保存在数据库)

场景:

springboot+springsecurity+mysql(jpa)实现:

1.pom依赖:

 1 <!-- security -->
 2         <dependency>
 3             <groupId>org.springframework.boot</groupId>
 4             <artifactId>spring-boot-starter-security</artifactId>
 5         </dependency>
 6         <dependency>
 7             <groupId>org.springframework.boot</groupId>
 8             <artifactId>spring-boot-starter-thymeleaf</artifactId>
 9         </dependency>
10
11         <!--jpa-->
12         <dependency>
13             <groupId>org.springframework.boot</groupId>
14             <artifactId>spring-boot-starter-data-jpa</artifactId>
15         </dependency>
16         <!--mysql-->
17         <dependency>
18             <groupId>mysql</groupId>
19             <artifactId>mysql-connector-java</artifactId>
20         </dependency>

2.application配置:

 1 spring.thymeleaf.prefix=classpath:/page/
 2
 3 #mysql连接地址
 4 spring.datasource.url=jdbc:mysql://localhost:3307/springboot_test
 5 #mysql用户名和密码
 6 spring.datasource.username=root
 7 spring.datasource.password=root
 8 #driver驱动
 9 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
10 #show sql
11 spring.jpa.show-sql=true
12 # Hibernate ddl auto (create, create-drop, update)
13 #### hibernate的ddl-auto=update配置表名,数据库的表和列会自动创建(根据Java实体)
14 spring.jpa.hibernate.ddl-auto=update
15 # 方言
16 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

3.连接数据库:db->bean->dao->service

public interface UserDao extends JpaRepository<User, Long>{

    User findByUserName(String userName);
    User findByUserNameAndPassword(String userName, String password);
}
@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public User findById(Long id){
        return userDao.findOne(id);
    }

    public User findByUserName(String userName){
        return userDao.findByUserName(userName);
    }

    public User login(String userName, String password){
        return userDao.findByUserNameAndPassword(userName, password);
    }

    public List<User> userList(){
        return userDao.findAll();
    }
}

实体类User

@Entity
@Table(name = "user")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String userName;
    private String password;
    private String pwdBak;
    private String role;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<SimpleGrantedAuthority> auths = new ArrayList<>();
        auths.add(new SimpleGrantedAuthority(this.getRole()));
        return auths;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return this.userName;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPwdBak() {
        return pwdBak;
    }

    public void setPwdBak(String pwdBak) {
        this.pwdBak = pwdBak;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName=‘" + userName + ‘\‘‘ +
                ", password=‘" + password + ‘\‘‘ +
                ", pwdBak=‘" + pwdBak + ‘\‘‘ +
                ", role=‘" + role + ‘\‘‘ +
                ‘}‘;
    }
}

4.websecurity配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)//开启进入Controller之前,检验权限。这个注解配置后,Controller中的@PreAuthorize("hasAnyAuthority(‘ADMIN‘)")才会生效
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @SuppressWarnings("SpringJavaAutowiringInspection")
    @Autowired
    private MyUDService myUDService;
    @Bean
    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {

        httpSecurity.authorizeRequests()
                .antMatchers("/", "/login", "/err/*").permitAll() //无需验证权限
                .anyRequest().authenticated() //其他地址的访问均需验证权限
                .and().formLogin().loginPage("/login").defaultSuccessUrl("/home").permitAll()//指定登录页是"/login" //登录成功后默认跳转到"/home"
                .and().logout().logoutSuccessUrl("/login").permitAll(); //退出登录后的默认url是"/login"
    }

    /**
     * 全局配置
     * @param builder
     * @throws Exception
     */
    @Autowired
    public void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder
                .userDetailsService(myUDService)
                .passwordEncoder(this.passwordEncoder());
    }

    /**
     * 设置用户密码的加密方式:MD5加密
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        PasswordEncoder pe = new PasswordEncoder() {//自定义密码加密方式
            //加密
            @Override
            public String encode(CharSequence charSequence) {
                return MD5Util.encode((String)charSequence);
            }

            //校验密码
            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return MD5Util.encode((String)charSequence).equals(s);
            }
        };
        return pe;
    }
}

5.用户权限查询类UserDetailsService:

@Component
public class MyUDService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        User user = userService.findByUserName(s);
        if(user == null) {
            throw new UsernameNotFoundException("UserName " + s + " not found");
        }

        System.out.println("用户" + s + ":" + user);
        return user;
    }
}

6.启动类:

@SpringBootApplication
public class Start02App {

    public static void main(String[] args) {
        SpringApplication.run(Start02App.class, args);
    }

    /**
     * 自定义异常页
     */
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer(){
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
                container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
                container.addErrorPages(new ErrorPage(java.lang.Throwable.class,"/error/500"));
                container.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN,"/error/403"));
            }
        };
    }
}

7.页面

8.往数据库插入数据(单元测试):

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Start02App.class)
public class UserServiceTest {

    @Autowired
    private UserDao userDao;
    @Autowired
    private UserService userService;

    private ObjectMapper objectMapper = new ObjectMapper();

    @Test
    public void testAll() throws JsonProcessingException {

        this.saveUser();
        this.list();

    }

    private void saveUser() throws JsonProcessingException {
        User admin = new User();
        admin.setUserName("admin");
        admin.setPassword(MD5Util.encode("admin"));
        admin.setPwdBak("admin");
        admin.setRole("ADMIN");
        User adminSave = userDao.save(admin);
        for(int i=0;i<=5;i++) {
            System.out.println("admin save--->:" + objectMapper.writeValueAsString(adminSave));
            User user = new User();
            user.setUserName("test"+i);
            user.setPassword(MD5Util.encode("user" + i));
            user.setPwdBak("user" + i);
            user.setRole("USER");
            User userSave = userDao.save(user);
            System.out.println("user save--->:" + objectMapper.writeValueAsString(userSave));
        }
    }

    private void list() throws JsonProcessingException {
        List<User> userList = userService.userList();
        System.out.println("用户列表:" + objectMapper.writeValueAsString(userList));
    }

}

查看数据库:

启动app类,访问:http://localhost:8080/

测试:

先点击“去主页”或“查看用户列表”,要求输入用户名密码:

使用admin登录,跳转到主页:

返回后,点击去“用户列表”,跳转到403,提示没有权限:

注销后使用普通用户登录,可以跳转到用户列表页面:

测试500页面:

测试404页面:

项目地址:https://github.com/yangzhenlong/mySpringBootDemo/tree/master/springboot11-auth/springboot11-security02FromDB

时间: 2024-07-30 13:34:48

springboot11-security02FromDB 权限管理(用户信息和角色信息保存在数据库)的相关文章

权限管理系统 用户信息 --MyRapid 快速开发框架 Winform

1.1.2 用户信息 用户信息对用户信息进行登记,对于权限管理来说,这里只有用户编号具有意义,权限系统根据用户编号进行用户识别绑定.其他信息,例如:权限.部门.帐号类型等是框架所需要用到的属性,并不涉及权限管理,权限管理只会根据用户的角色分配功能模块以及页面按钮.

企业分布式微服务云SpringCloud SpringBoot mybatis (十六)Spring Boot中使用LDAP来统一管理用户信息

LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化.目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力.目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略.而目录服务的更新则一般都非常简单.这种目录可以存储包括个人信息.web链结.jpeg图像等各种信息.为了访问存储在目录中的

基于ThinkPHP框架小程序获取微信用户信息并将存进数据库

场景描述:在微信小程序中,我们可能用到很多种登陆方式,例如用手机作为标识登陆亦或者用微信信息作为标识登陆(但这写都要看你的项目需要),在这里我说一下如何使用微信信息作为标识登陆. 编程思路:分三步走,第一步微信信息获取发送给后台->第二步解密微信信息验证数据库->登陆成功保存缓存并且更新token 小程序前端处理 1 //调用登录接口,获取 code 2 wx.login({ 3 success: function (res) { 4 //微信js_code 5 that.setData({

权限管理用户权限挂靠到菜单上

原文地址:https://www.cnblogs.com/jintian/p/11255287.html

项目记录:登陆( 保存用户名密码 kaptcha验证码 shiro权限管理 RSA加密 非明文保存)

1.登陆页代码 1)引入js <script type="text/javascript" src="${base}/resources/admin/js/jquery.js"></script> <script type="text/javascript" src="${base}/resources/admin/js/jquery.validate.js"></script>

微信开发笔记——微信网页登录授权,获取用户信息

最近做了一个公司的微信的公众号,对微信的流程清楚了不少,这里记录下,算不上多高深的,只希望能帮助到一部分人吧. 我们公司的测试微信公众号:NPCgo 可以感受下,哈哈~~ 闲话少说,开始: 首先大家要看下微信的API文档. 微信网页授权,获取用户的微信官方API文档地址:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 三次握手微信认证流程(我自己简称三次握手): 1.用户同意授权,获取code 2.通过c

上课笔记第三十一天MySQL并发控制、引擎、用户权限管理、查询缓存

1.MySQL并发控制机制        并发控制:每个会话会启动一个mysql线程               服务器层:用于控制锁               存储引擎层:并发访问控制基本上应该由存储引擎层完成 锁:lock                读锁:共享锁                写锁:独占锁 锁力度:                 表级锁:myisam表级锁                 行级锁:innodb行级锁 锁分类:                 隐式锁:由

Centos 6,7 用户的权限管理

Centos6, 7 用户和权限管理 之所以设置用户和权限管理机制,主要是为了实现用户之间的隔离,形成独立的空间 每个用户所对应的访问权限不同,不可以越权限操作 1.  先从用户的分类开始 用户分为: 管理员:root 普通用户(又分为): 系统用户:仅用于运行服务程序: 登录用户:系统资源的正常使用者: 如果仅有用户名,而计算机又不会识别名字,只会识别数字,所以每个用户名都对应一个纯数字的 用户标识,就叫做用户ID 用户标识:UserID, UID (16bits二进制数字:0-65535:)

[8-25]用户管理和权限管理知识梳理

本文旨在复习Linux中用户管理.权限管理,基本原理,基本命令. 知识储备 用户是系统资源分配的基本单位[请注意不是最小单位,最小单位应该是进程] 一个用户在登录计算机,并取得资源执行A进程整个过程,步骤如下: 和用户相关的文件/etc/passwd./etc/shadow 和组相关的文件/etc/group./etc/gshadow 本文以这4个文件为核心来讲解用户管理和权限管理 用户基本概念 "用户",对人而言使用username描述标识的:对Linux,是用UID来描述和标识的: