vue+springmvc前后端分离开发(六)(repository与spring security的具体配置)

Repository

  • repository是用来定义数据的相关操作的,比如根据id找到对应的用户
  • 有了jpa以后,我们可以仅仅使用接口定义的方式就能够完成数据集的增删查改

定义一个Repository

  • 首先要在项目中创建一个repository的包,并且在里面创建一个user包
    创建包
  • 再在其中创建一个UserRepository接口,代码如下
package kmhc.repository.user;

import java.util.Optional;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import kmhc.domain.user.User;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

	Optional<User> findByUsername(String username);
}
  • 对上面的代码进行分析
    • @Repository表明这是一个repository,将其添加到spring上下文管理之中
    • 接口继承了CrudRepository<User, Long>,这里的User指我们定义的领域类,表明是谁的仓库,Long代表了主键的类型
    • 这只是一个接口,但是足够了,因为jpa会在运行时自动帮我们实现接口的实现类,用到了动态代理的技术
  • 其它领域类的接口也是同理,下面给出代码
package kmhc.repository.user;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import kmhc.domain.user.Authority;

@Repository
public interface AuthorityRepository extends CrudRepository<Authority, Long> {

}
package kmhc.repository.user;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import kmhc.domain.user.Group;

@Repository
public interface GroupRepository extends CrudRepository<Group, Long> {

}
package kmhc.repository.user;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import kmhc.domain.user.GroupAuthority;

@Repository
public interface GroupAuthorityRepository extends CrudRepository<GroupAuthority, Long> {

}
  • 有了repository以后,我们就可以通过@Autowired的方式使用它了

自定义UserDetails

  • spring security默认的UserDetails只包含了username,password,enabled等基本信息,并不包含我们扩展的信息,所以我们需要对UserDetails进行扩展
  • 具体的做法是实现UserDetailsService,并且重写里面的loadUserByUsername方法
  • 首先在项目中创建一个名叫security的包
    security包
  • 然后创建一个类,实现UserDetailsService,代码如下
package kmhc.security;

import java.util.Optional;

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.stereotype.Service;

import kmhc.domain.user.User;
import kmhc.repository.user.UserRepository;

@Service
public class CustomUserDetailsService implements UserDetailsService {

	@Autowired
	private UserRepository userRepo;
	
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		Optional<User> optional = userRepo.findByUsername(username);
		if (optional.isPresent()) {
			return optional.get();
		}
		throw new UsernameNotFoundException("User '" + username + "' not found!");
	}
}
  • 对上面的代码进行分析
    • @Service表明它是一种服务,注册到spring的上下文管理之中
    • @Autowired用于自动注入,注意这里注入的是Bean,它和普通的new一个类是有很大区别的
    • 实现UserDeailsService接口,并且重写了loadUserByUsername()方法,从这里的方法名就可以看出spring security是根据username查找用户的,所以把username当成主键也是一种不错的选择,否则需要在username上建立索引以提高查找效率
    • 方法内部调用了UserRepository的findByUsername()的方法,UserRepository里面有几个默认的方法,我们不需要重写
    • Optional类可以有效地避免在第一次没找到username的情况下就报错,而是会返回一个null,可以使用optional.isPresent()来判断用户是否存在
    • 不存在就抛出UsernameNotFoundException异常,并自定义错误信息

Spring Security的具体配置

  • 有了自定义的UserDetails后,就可以将它当作spring security身份验证中的默认配置了
  • 先给出Spring Security配置的代码
package kmhc.security;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private CustomUserDetailsService userDetailsService;
	
	@Autowired
	private DataSource dataSource;	

	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth
			.userDetailsService(userDetailsService)
			.passwordEncoder(encoder());
		auth
			.jdbcAuthentication()
			.dataSource(dataSource)
			.usersByUsernameQuery(
					"select username, password, enabled from users where username = ?"
					)
			.authoritiesByUsernameQuery(
					"select username, authority from authorities where user_id in (select user_id from users where username = ?)"
					)
			.groupAuthoritiesByUsername(
					"select g.id, g.group_name, ga.authority from user_groups g, group_members gm, group_authorities ga " +
					"where gm.user_id in (select user_id from users where username = ?) and g.id = ga.group_id and g.id = gm.group_id"
					);
		
	}
		
	@Bean
	public PasswordEncoder encoder() {
		return new BCryptPasswordEncoder();
	}
}
  • 对上面的代码进行分析
    • 自动注入了自定义的UserDetailsService和DataSource,这里DataSource直接注入即可,没有任何其它修改
    • 重写了configure()方法,对参数auth进行设置,调用userDetailsService()设置为我们自定义的UserDetailsService;调用passwordEncoder,设置密码加密解密为我们自定义的PasswordEncoder,注意这是一个Bean,会加入到spring的上下文管理之中
    • 还设置用户存储模式为jdbc存储,设置datasource并且修改了三条查询语句
  • 以上几点配置完毕后,Spring Security就可以正式的投入工作了,至少在权限管理方面能够正常的工作

至此,对repository的配置和spring security的权限配置已讲解完毕,下一节就开始正式地进行restful api的开发了,并且使用postman工具对后端接口测试

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue springboot前后端分离开发实战pdf是一本介绍如何使用VueSpring Boot进行前后端分离开发的实战指南。本书详细讲解了如何使用Vue框架搭建前端应用,以及如何利用Spring Boot框架构建后端应用,旨在帮助读者掌握前后端分离开发的技术和方法。 在这本书中,作者首先介绍了前后端分离开发的概念和背景,解释了为什么前后端分离可以带来更好的开发体验和效率。接着,作者详细介绍了Vue框架的基本概念和使用方法,包括组件化开发、路由管理、状态管理等方面的内容。读者可以通过跟随书中的示例代码,逐步学习并实践Vue框架的应用。 在后半部分,作者重点介绍了Spring Boot框架的使用。读者将学习如何使用Spring Boot快速搭建后端应用,并了解如何通过RESTful API与前端应用进行数据交互。此外,作者还介绍了Spring SecuritySpring Data JPA等常用的配套技术,帮助读者构建安全可靠的后端应用。 本书不仅提供了理论知识,还提供了大量的实战案例和实例代码。读者可以跟随书中的示例项目逐步实践,从而更好地掌握VueSpring Boot的开发技巧。此外,本书还涉及了一些项目管理和部署的内容,帮助读者了解如何将前后端分离的应用部署到生产环境中。 总而言之,vue springboot前后端分离开发实战pdf是一本适合想要学习并实践前后端分离开发开发人员的实用指南,通过学习本书,读者将获得丰富的知识和经验,能够独立设计和开发前后端分离的应用程序。 ### 回答2: 《Vue SpringBoot前后端分离开发实战PDF》这本书是一本关于前后端分离开发实践的指南。它结合了VueSpringBoot两个流行的开发框架,帮助开发者更好地理解和应用这两个技术。 在书中,作者首先介绍了前后端分离的概念和优势。前后端分离开发可以提高开发效率和协作性,同时也能提供更好的性能和扩展性。然后,作者详细介绍了Vue框架的基本知识和使用方法,包括Vue的搭建、组件的创建和组织等。读者可以通过实际的案例来学习和练习。 接着,作者转向SpringBoot框架的介绍和使用。SpringBoot是一个轻量级的Java开发框架,可以快速构建和部署应用程序。作者讲解了如何使用SpringBoot创建RESTful API,以及如何与Vue前端进行交互。 在书的后半部分,作者提供了一些实战案例和示例代码。这些案例涵盖了常见的前后端分离开发场景,如用户管理、权限控制、数据交互等。通过这些案例,读者可以了解到如何将VueSpringBoot无缝地结合起来,构建强大的应用程序。 总的来说,《Vue SpringBoot前后端分离开发实战PDF》是一本非常实用的书籍。它不仅系统地介绍了VueSpringBoot的基础知识和使用方法,还提供了丰富的实战经验和案例。对于想要掌握前后端分离开发技术的开发者来说,这本书是一个很好的学习资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值