5.服務端登入介面製作
阿新 • • 發佈:2020-08-04
Hr繼承UserDetails
public class Hr implements UserDetails { private Integer id; private String name; private String phone; private String telephone; private String address; private Boolean enabled; private String username; private String password; private String userface; private String remark; private List<Role> roles; public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone == null ? null : phone.trim(); } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone == null ? null : telephone.trim(); } public String getAddress() { return address; } public void setAddress(String address) { this.address = address == null ? null : address.trim(); } public void setEnabled(Boolean enabled) { this.enabled = enabled; } @Override public String getUsername() { return username; } public void setUsername(String username) { this.username = username == null ? null : username.trim(); } @Override public String getPassword() { return password; } public void setPassword(String password) { this.password = password == null ? null : password.trim(); } public String getUserface() { return userface; } public void setUserface(String userface) { this.userface = userface == null ? null : userface.trim(); } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark == null ? null : remark.trim(); } @Override public Collection<? extends GrantedAuthority> getAuthorities() { List<SimpleGrantedAuthority> authorities = new ArrayList<>(roles.size()); for (Role role : roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); } return authorities; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return enabled; } }
HrService 實現UserDetailsService介面
@Service public class HrService implements UserDetailsService { @Autowired HrMapper hrMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Hr hr= hrMapper.loadUserByUsername(username); if(hr==null){ throw new UsernameNotFoundException("使用者不存在"); } hr.setRoles(hrMapper.getHrRolesById(hr.getId())); return hr; } }
HrMapper
public interface HrMapper { int deleteByPrimaryKey(Integer id); int insert(Hr record); int insertSelective(Hr record); Hr selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Hr record); int updateByPrimaryKey(Hr record); Hr loadUserByUsername(String username); List<Role> getHrRolesById(Integer id); }
HrMapper.xml
<select id="loadUserByUsername" resultMap="BaseResultMap">
select * from hr where username = #{username}
</select>
SecurityConfig
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
HrService hrService;
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(hrService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter("username")
.passwordParameter("password")
.loginProcessingUrl("/doLogin")
.loginPage("/login")
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
httpServletResponse.setContentType("application/json;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
Hr hr =(Hr) authentication.getPrincipal();
hr.setPassword(null);
RespBean ok=RespBean.ok("登入成功",hr);
String s = new ObjectMapper().writeValueAsString(ok);
out.write(s);
out.flush();
out.close();
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
httpServletResponse.setContentType("application/json;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
RespBean respBean = RespBean.error("登入失敗");
if (e instanceof LockedException) {
respBean.setMsg("賬號被鎖定,請聯絡管理員");
} else if (e instanceof CredentialsExpiredException) {
respBean.setMsg("密碼過期,請聯絡管理員!");
}else if (e instanceof AccountExpiredException){
respBean.setMsg("賬戶過期,請聯絡管理員");
}else if(e instanceof DisabledException){
respBean.setMsg("賬戶被禁用,請聯絡管理員");
} else if (e instanceof BadCredentialsException) {
respBean.setMsg("使用者名稱或密碼錯誤,請聯絡管理員");
}
out.write(new ObjectMapper().writeValueAsString(respBean));
out.flush();
out.close();
}
})
.permitAll()
.and()
.logout()
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
httpServletResponse.setContentType("application/json;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
out.write(new ObjectMapper().writeValueAsString(RespBean.ok("登出成功")));
out.flush();
out.close();
}
})
.permitAll()
.and()
.csrf().disable();
}
}
RespBean.java
public class RespBean {
private Integer status;
private String msg;
private Object obj;
public static RespBean ok(String msg){
return new RespBean(200, msg, null);
}
public static RespBean ok(String msg,Object obj){
return new RespBean(200, msg, obj);
}
public static RespBean error(String msg){
return new RespBean(500, msg, null);
}
public static RespBean error(String msg,Object obj){
return new RespBean(500, msg, obj);
}
private RespBean(){
}
private RespBean(Integer status, String msg, Object obj) {
this.status = status;
this.msg = msg;
this.obj = obj;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
HelloController
@RestController
public class HelloController {
@GetMapping
public String hello(){
return "hello";
}
}
LoginController
@RestController
public class LoginController {
@GetMapping("/login")
public RespBean login() {
return RespBean.error("尚未登入,請登入");
}
}