boke例子:用户登录

1.首先创建user表,authority表(角色),user_authority,表(用户角色表)

Authority实体类,需要继承:GrantedAuthority类,

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; import org.springframework.security.core.GrantedAuthority; /**
* 权限
* @author
*
*/
@Entity
public class Authority implements GrantedAuthority { private static final long serialVersionUID = 1L; @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id; @Column(nullable=false, length=20)
private String name; @Override
public String getAuthority() {
// TODO Auto-generated method stub
return name;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} }

  

User类.需要继承security的UserDetails类:

并复写:isAccountNonExpired,isAccountNonLocked,isCredentialsNonExpired, isEnabled返回true值

同事复写:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//需将 List<Authority> 转成 List<SimpleGrantedAuthority>,否则前端拿不到角色列表名称
List<SimpleGrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
for(GrantedAuthority authority: this.authorities)
{
simpleGrantedAuthorities.add(new SimpleGrantedAuthority(authority.getAuthority()));
}
return simpleGrantedAuthorities;
}

  

如下:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.validation.constraints.Size; import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; @Entity
public class User implements UserDetails,Serializable { /**
*
*/
private static final long serialVersionUID = 1L; //private AtomicLong atomicLong = new AtomicLong(); @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id; @NotEmpty(message="姓名不能为空")
@Size(min=2, max=20)
@Column(nullable=false, length=20)
private String name; @NotEmpty(message="邮箱不能为空")
@Size(max=50)
@Email(message="邮箱格式不正确")
@Column(nullable=false, length=50, unique=true)
private String email; @NotEmpty(message="账号不能为空")
@Size(min=3, max=20)
@Column(nullable=false, length=20, unique=true)
private String username; @NotEmpty(message="密码不能为空")
@Size(min=3, max=20)
@Column(nullable=false, length=20)
private String password; @Column(length=200)
private String avatar; //权限多对多
@ManyToMany(cascade = CascadeType.DETACH, fetch = FetchType.EAGER)
@JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "authority_id", referencedColumnName = "id"))
private List<Authority> authorities; public User() { } public User(Long id, String name, String email, String username, String password) {
this.id = id;
this.name = name;
this.email = email;
this.username = username;
this.password = password;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} 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 String getAvatar() {
return avatar;
} public void setAvatar(String avatar) {
this.avatar = avatar;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", email=" + email + ", username=" + username + "]";
} @Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//需将 List<Authority> 转成 List<SimpleGrantedAuthority>,否则前端拿不到角色列表名称
List<SimpleGrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
for(GrantedAuthority authority: this.authorities)
{
simpleGrantedAuthorities.add(new SimpleGrantedAuthority(authority.getAuthority()));
}
return simpleGrantedAuthorities;
} public void setAuthorities(List<Authority> authorities) {
this.authorities = authorities;
} @Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
} @Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
} @Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
} @Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
} }

  

同事创建user的userservice及userserviceImpl实现类,serviceImple继承userService和security的UserDetailsService

UserService:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import com.muyang.boke2.entity.User; /**
* 用户服务接口
* @author feeyo
*
*/
public interface UserService { /**
* 保持用户
* @param user
* @return
*/
User saveOrUpdateUser(User user); /**
* 注册用户
* @param user
* @return
*/
User registerUser(User user); /**
* 删除用户
* @param id
*/
void removeUser(Long id); /**
* 根据id查找用户
* @param id
* @return
*/
User findById(Long id); /**
* 根据用户的姓名分页查找用户
* @param name
* @param pageable
* @return
*/
Page<User> listUsersByName(String name, Pageable pageable); /**
* 按分页查找数据
* @param pageable
* @return
*/
Page<User> findAll(Pageable pageable);
}

  

UserServiceImpl:

继承security的UserDetailsService ,复写loadUserByUsername方法

/**
* 用户服务接口实现
* @author feeyo
*
*/
@Service
public class UserServiceImpl implements UserService, UserDetailsService { @Autowired
UserRepository userRepository; @Transactional
@Override
public User saveOrUpdateUser(User user) {
// TODO Auto-generated method stub
return userRepository.save(user);
} @Transactional
@Override
public User registerUser(User user) {
// TODO Auto-generated method stub
return userRepository.save(user);
} @Transactional
@Override
public void removeUser(Long id) {
// TODO Auto-generated method stub
userRepository.delete(id);
} @Override
public User findById(Long id) {
// TODO Auto-generated method stub
return userRepository.findOne(id);
} @Override
public Page<User> listUsersByName(String name, Pageable pageable) {
// TODO Auto-generated method stub
name = "%" + name + "%";
Page<User> users = userRepository.findByNameLike(name, pageable);
return users;
} @Override
public Page<User> findAll(Pageable pageable) {
// TODO Auto-generated method stub Page<User> users = userRepository.findAll(pageable); return users;
} @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// TODO Auto-generated method stub
return userRepository.findByUsername(username);
} }

  

SecurityConfig网站全局配置/登录配置

@EnableWebSecurity
//启用全局post安全方法设置
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { private static final String key = "muyang.my"; @Autowired
private UserDetailsService userDetailsService; /**
* 加密方法
* @return
*/
@Bean
public PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder(); } @Bean
public AuthenticationProvider authenticationProvider() {
//从数据库获取信息
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
//密码加密方式
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider; } @Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
//super.configure(http);
//关闭csrf验证:跨站攻击
//http.csrf().disable();
//权限设置
http.authorizeRequests() //定义那些url需要保护,哪些不需要保护
.antMatchers("/static/**").permitAll() //都可以访问
.antMatchers("/user/**").hasRole("ADMIN") //需要登陆才能访问
.and()
.headers().frameOptions().disable() //解决js跨站把x-frame-options disable即可
.and()
.formLogin() //基于FORM表单登陆验证
.loginPage("/login").failureUrl("/login-error") //自定义登陆界面//自定义登陆错误页面
.and().rememberMe().key(key) //记住我
.and().exceptionHandling().accessDeniedPage("/403"); // 处理异常,拒绝访问就重定向到 403 页面
} /**
* 认证信息管理
* @param auth
* @throws Exception
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// TODO Auto-generated method stub
//super.configure(auth);
//auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
auth.userDetailsService(userDetailsService);
auth.authenticationProvider(authenticationProvider());
} /**
* 自动加载security-taglibs
* @return
*/
@Bean
@ConditionalOnMissingBean(ClassPathTldsLoader.class)
public ClassPathTldsLoader classPathTldsLoader(){
return new ClassPathTldsLoader();
} }

  

boke例子:用户登录的更多相关文章

  1. MVC4方法行为过滤器例子(用户登录)

    在Model文件夹下添加一个类MyActionFilterAttribute继承于ActionFilterAttribute: using System; using System.Collectio ...

  2. python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)

    一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...

  3. JSP小例子——实现用户登录小例子(不涉及DB操作)

    实现用户登录小例子用户名和密码都为"admin",登陆成功使用服务器内部转发到login_success.jsp页面,并且提示登陆成功的用户名.如果登陆失败则请求重定向到login ...

  4. PHP验证用户登录例子-学习笔记

    1.基本流程: 2.UML类图: 3.PHP代码: 3.1 index.php <?php /** * Created by PhpStorm. * User: andy * Date: 16- ...

  5. C#语言Winform防SQl注入做用户登录的例子

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. Flask最强攻略 - 跟DragonFire学Flask - 第五篇 做一个用户登录之后查看学员信息的小例子

    需求: 1. 用户名: oldboy 密码: oldboy123 2. 用户登录成功之后跳转到列表页面 3. 失败有消息提示,重新登录 4.点击学生名称之后,可以看到学生的详细信息 后端: from ...

  7. JSP小例子——以Model1的思想实现用户登录小例子(不涉及DB操作)

    Model1简介现在比较流行的就是Model1和Model2,这里介绍Model1.在Model1模型出现前,整个Web应用的情况是:几乎全部由JSP页面组成,JSP页面接受处理客户端请求,对请求处理 ...

  8. Struts2整合Hibernate3实现用户登录功能

    所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...

  9. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

随机推荐

  1. 头像上传uploadPreview插件

    原文链接:https://blog.csdn.net/Alisa_L/article/details/52923953 uploadPreview 今天写头像上传,使用到uploadPreview插件 ...

  2. 你不知道的JavaScript(1)LHS查询和RHS查询

    打算把<你不知道的JavaScript>中的知识点整理下,写点自己的心得,同时也敦促自己看书. 先做个整体的介绍,最后会再给个综合的例子. RHS 查询与简单地查找某个变量的值别无二致,而 ...

  3. bzoj 1295 最长距离 - 最短路

    Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...

  4. mtr 命令

    mtr命令的使用: -r  --report  以报告的方式发布监测的结果 -s 30   指定发送包的大小  这个随意   按照自己的需求 -i 10  设置icmp协议返回包的时间 -n  no- ...

  5. C# 文件与二进制之间的转换

    /// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...

  6. vue学习【第三篇】:vue之node.js的简单介绍

    什么是node.js 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 安装node.js node.js的特性 - 非阻塞IO模型 - 时 ...

  7. MongoDB NoSQL 常用指令

    查询 日期区间 db.<collections>.find({"service_name":"xxx"}).sort({ update_time:- ...

  8. Git 命令收集

    目录 1.清理恢复 2.回滚,reset与revert的区别 3.merge,rebase,cherry-pick区别 4.删除不存在对应远程分支的本地分支 5.git pull,git push 报 ...

  9. 深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning)

    深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning) 2018-08-09 12:21:33 The video tutorial can ...

  10. POJ 3278 Catch That Cow(赶牛行动)

    POJ 3278 Catch That Cow(赶牛行动) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 Farmer J ...