<h4>场景</h4>

<h4>代码</h4>

springboot+springsecurity+mysql(jpa)实现:

1.pom依赖:

 <!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> <!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

2.application配置:

 spring.thymeleaf.prefix=classpath:/page/

 #mysql连接地址
spring.datasource.url=jdbc:mysql://localhost:3307/springboot_test
#mysql用户名和密码
spring.datasource.username=root
spring.datasource.password=root
#driver驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#show sql
spring.jpa.show-sql=true
# Hibernate ddl auto (create, create-drop, update)
#### hibernate的ddl-auto=update配置表名,数据库的表和列会自动创建(根据Java实体)
spring.jpa.hibernate.ddl-auto=update
# 方言
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));
} }

查看数据库:

<h4>效果</h4>

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

测试:

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

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

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

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

测试500页面:

测试404页面:

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

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

  1. Linux用户和权限——管理用户和用户组的命令

    Linux用户和权限——管理用户和用户组的命令 摘要:本文主要学习了在Linux系统中管理用户和用户组的命令. useradd命令 useradd命令可以用来创建新用户. 基本语法 useradd [ ...

  2. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息]

    三.使用Azure AD管理用户信息 在上一章我们采用OpenID的方案和Azure AD交互进行身份验证,本章节我们继续了解如何在Azure AD中创建用户,列出用户信息,修改用户信息和删除用户信息 ...

  3. ThinkPHP 3 的CURD管理用户信息 修改和删除

    本节课大纲: 一.ThinkPHP 3 的CURD管理用户信息 http://localhost:8080/thinkphp/index.php/User/index 访问User类的index方法 ...

  4. HDFS权限管理用户指南

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html 概述 用户身份 理解系统的实现 文件系统API变更 S ...

  5. VisualSVN Server仓库迁移到Linux(包含所有版本, 权限,用户信息)

    公司开发服务器从Windows换成CentOS,所以要把原服务都转移到Linux下,MySQL.SMB的迁移都很顺利,但是SVN的转移却遇到了些问题,花费了三天时间,走了不少弯路,现在总算解决了SVN ...

  6. springboot学习笔记:11.springboot+shiro+mysql+mybatis(通用mapper)+freemarker+ztree+layui实现通用的java后台管理系统(权限管理+用户管理+菜单管理)

    一.前言 经过前10篇文章,我们已经可以快速搭建一个springboot的web项目: 今天,我们在上一节基础上继续集成shiro框架,实现一个可以通用的后台管理系统:包括用户管理,角色管理,菜单管理 ...

  7. Linux 用户和用户组管理-用户信息文件

    用户信息文件存在在/etc/passwd中,vi /etc/passwd 其中,有七列以:分隔的信息 第一列表示用户(account),第二列表示密码标志(真正的密码存在在/etc/shadow中), ...

  8. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.4 Edit修改用户信息]

    3.4 Edit修改用户信息 我们用FormCollection简化了表单提交,非常方便的进行用户信息修改. [HttpPost, Authorize] public async Task<Ac ...

  9. Spring Boot教程(四十二)LDAP来管理用户信息(2)

    使用spring-data-ldap的基础用法,定义LDAP中属性与我们Java中定义实体的关系映射以及对应的Repository @Data @Entry(base = "ou=peopl ...

随机推荐

  1. 2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat

    题意:四个操作,区间加,区间每个数乘,区间的数变成 2^64-1-x,求区间和. 题解:2^64-1-x=(2^64-1)-x 因为模数为2^64,-x%2^64=-1*x%2^64 由负数取模的性质 ...

  2. Linux登录那点事

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 我们登录linux的时候基本上不太关注上面的这个提示,其实这个还是有点文章的 ...

  3. Http协议常见状态码

    206 - 断点下载时用到,客户端请求了一部分内容,服务器成功把这部分内容返回给它,这时候就是用这个状态. 301 - 永久跳转,原地址不存在了,url被指向到另一个地址.这个主要是搜索引擎相关,影响 ...

  4. 数据库和Django model 生成和反向生成

    Django 脚本生成数据表 建立映射关系 如果询问时区时间,选1 然后输入timezone.now() python manage.py makemigrations (如果有子应用的话子应用名称填 ...

  5. codeblocks: 使用静态(static)链接库(pcre)的配置

    说明:在c/c++程序中使用静态链接库,编译后不再需要相关的dll文件(如:libpcre-1.dll,libpcreposix-0.dll)就可以正常的运行. 现在遇到一个问题,如果使用 pcre_ ...

  6. JavaScript(JS)之Javascript对象DOM(五)

    https://www.cnblogs.com/haiyan123/p/7653032.html 一.JS中for循环遍历测试 for循环遍历有两种 第一种:是有条件的那种,例如    for(var ...

  7. react-native中的state

    我们使用两种数据来控制一个组件:props和state.props是在父组件中指定, 而且一经指定,在被指定的组件的生命周期中则不再改变. 对于需要改变的数据,我们需要使用state. 假如我们需要制 ...

  8. 第五篇 - Selenium突破反爬获取qq邮件标题

    from selenium import webdriver from selenium.webdriver import ActionChains #1.打开登陆页面 wd = webdriver. ...

  9. JavaScript之美读书笔记一

    前两天去图书馆借了一本<JavaScript之美>,在书架上无意中看到的,想着那就看看吧. 第一章 原型 有些JavaScript爱好者宣称JavaScript是一种基于原型而不是面向对象 ...

  10. python学习笔记-Day2 Numpy数组

    1. 实现两个数组相加,在数据量特别大的时候 产生数组: (1)  从列表产生数组:a=[0,1,2,3] a=np.array(1) a (2)  从列表传入 a=np.array([1,2,3,4 ...