zoukankan      html  css  js  c++  java
  • boke例子:用户登录

    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();
    	    }
    	
    	
    }
    

      

  • 相关阅读:
    在Qt中使用sleep
    Qt深入:不能不知道的Type、Attribute和Flags
    浅析mysql 共享表空间与独享表空间以及他们之间的转化
    taobao月报 ---mysql汇总
    slave_net_timeout
    LINUX 内核算杂 七杂 八
    Hadoop可视化与交互式工具:Zeppelin和Hue
    看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)
    python 学习笔记十四 jQuery案例详解(进阶篇)
    MySQL如何选择float, double, decimal
  • 原文地址:https://www.cnblogs.com/achengmu/p/9760531.html
Copyright © 2011-2022 走看看