Los novatos usan la seguridad todos los días

Doloroso doloroso

1. El primero son los problemas de dominio cruzado , si su proyecto está separado del frente y de atrás. Entonces debe haber problemas repugnantes entre dominios. Pero usualmente uso un método más convencional para lograr el dominio cruzado, es decir, configurar el dominio cruzado cors en el arranque de primavera. Si tienes amigos necesitados, puedes leer otro blog mío. Volver al tema: si usa seguridad con los extremos frontal y posterior separados, informará un error entre dominios. Yo? ? ? ? ? ¿Estoy configurado para dominio cruzado? ¿Por qué todavía me recuerdas los problemas de dominio cruzado? Estoy muy angustiado. Me pregunto si mi enfoque de dominio cruzado es demasiado bajo. Así que cambié el método de dominio cruzado innumerables veces, desde el fondo al primer plano, de axios a jsonp, no, al final, descubrí que la seguridad de la primavera todavía tiene la culpa.
Debe configurarlo en el método
Inserte la descripción de la imagen aquí

** void configure (HttpSecurity http) en su archivo MyWebSecurityConfig . Eso es correcto. Necesita configurar esta configuración cor (). De lo contrario, nunca puedes cruzar el dominio. 2. Luego, después de haber escrito el código, desea probar si hay algo incorrecto. Lo cambia, cambia los permisos de inicio de sesión exitoso a error de inicio de sesión y luego lo descubre. ? ? No es bueno? Así que vas directamente a la dirección del backend, por desgraciaEstilo audaz ** ¿
está bien? ? ¿Por qué, puedo hacer esto, pero los extremos delantero y trasero no se pueden separar? Inserte la descripción de la imagen aquí
¿Acabo de devolverte un trozo de html y permitirte iniciar sesión nuevamente? Jajajaja, así es como lo hice, fue demasiado doloroso, después de dos o tres días de cambio. De repente, mi amigo me dijo que la diferencia entre estas dos solicitudes es que una enviará información de la sesión, mientras que la otra no. Estoy avergonzado! Este es el caso, así que descubrí que si envía una solicitud normal cuando los extremos frontal y posterior están separados, la sesión que se realiza cada vez es diferente. Así es, es por esto, así que incluso después de iniciar sesión, no puede hacerlo cuando envía la solicitud nuevamente, porque la sesión de la solicitud que envió por segunda vez no tiene información sobre si inicia sesión o no. Una vez que la razón es clara, es fácil de manejar.
Inserte la descripción de la imagen aquí
Importe axios en main.js de su proyecto vue, y luego configure sus axios.defaults.withCredentials como true. Si está interesado en esta configuración, puede echar un vistazo. Usas la misma sesión. Ven a visitar de nuevo ahora!
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Aquí estamos solicitando http: // localhost: 8000 / admin / hello, e iniciamos sesión con la autoridad de este administrador (administrador del sistema). Para que pueda devolver un mensaje de administrador hola!
En este punto ya has terminado. Luego adjunte el código.

@Override
protected void configure(HttpSecurity http) throws Exception {
	http.cors().and().authorizeRequests()
	.antMatchers("/admin/**")
	.hasRole("ADMIN")
	.antMatchers("/user/**")
	.access("hasAnyRole('ADMIN','USER')")
	.antMatchers("/db/**")
	.access("hasRole('ADMIN') and hasRole('DBA')")
	.anyRequest()
	.authenticated()
	.and()
	.formLogin()
	//.loginPage("/login_page")
	.successHandler(new AuthenticationSuccessHandler () {

		@Override
		public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
				Authentication auth) throws IOException, ServletException {
			// TODO Auto-generated method stub
			Object pricipal = auth.getPrincipal();
			response.setContentType("application/json;charset=utf-8");
			PrintWriter out = response.getWriter();
			response.setStatus(200);
			Map<String, Object> map = new HashMap<>();
			map.put("status", 200);
			map.put("msg", pricipal);
			ObjectMapper om = new ObjectMapper();
			out.write(om.writeValueAsString(map));
			out.flush();
			out.close();
		}
		
	})
	
	.failureHandler(new AuthenticationFailureHandler () {

		@Override
		public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
				AuthenticationException e) throws IOException, ServletException {
			// TODO Auto-generated method stub
			response.setContentType("application/json;charset=utf-8");
			PrintWriter out = response.getWriter();
			response.setStatus(200);
			Map<String, Object> map = new HashMap<>();
			map.put("status", 401);
			if (e instanceof LockedException) {
				map.put("msg", "账户被锁定,登陆失败");
			} else if (e instanceof BadCredentialsException) {
				map.put("msg", "账户名或密码输入错误,登陆失败");
			} else if (e instanceof DisabledException) {
				map.put("msg", "账户被禁用,登陆失败");
			} else if (e instanceof AccountExpiredException) {
				map.put("msg", "账户已过期,登陆失败");
			} else if (e instanceof CredentialsExpiredException) {
				map.put("msg", "密码过期,登陆失败");
			} else {
				map.put("msg", "登陆失败");
			}
			
			ObjectMapper om = new ObjectMapper();
			out.write(om.writeValueAsString(map));
			out.flush();
			out.close();
		}
		
	})
	.loginProcessingUrl("/login")
	.usernameParameter("username")
	.passwordParameter("password")
	.permitAll()
	.and()
	.csrf()
	.disable()
	.exceptionHandling()
	.accessDeniedHandler(getAccessDeniedHandler());
	}

////////////////////////////////////////

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 xxp.entity.User;
import xxp.mapper.UserMapper;

@Service
public class UserService implements UserDetailsService{
	
	@Autowired
	private UserMapper usermapper;

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		// TODO Auto-generated method stub
		User user = usermapper.loadUserByUsername(username);
		if (user == null) {
			throw new UsernameNotFoundException("账户不存在");
		}
		// 通过id查找角色
		user.setRoles(usermapper.getUserRolesByUid(user.getId()));
		return user;
	}

}

/////

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

public class User implements UserDetails {
	private Integer id;
	private String username;
	private String password;
	private Boolean enabled;
	private Boolean locked;
	private List<Role> roles;

public User() {}
public User(Integer id, String username, String password, Boolean enabled, Boolean locked, List<Role> roles) {
	super();
	this.id = id;
	this.username = username;
	this.password = password;
	this.enabled = enabled;
	this.locked = locked;
	this.roles = roles;
}



public Integer getId() {
	return id;
}
public void setId(Integer id) {
	this.id = id;
}
public void setEnabled(Boolean enabled) {
	this.enabled = enabled;
}
public Boolean getLocked() {
	return locked;
}
public void setLocked(Boolean locked) {
	this.locked = locked;
}
public List<Role> getRoles() {
	return roles;
}
public void setRoles(List<Role> roles) {
	this.roles = roles;
}

public void setUsername(String username) {
	this.username = username;
}
public void setPassword(String password) {
	this.password = password;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
	// TODO Auto-generated method stub
	// 配置权限信息
	List<SimpleGrantedAuthority> authorities = new ArrayList<>();
	for (Role role: roles) {
		authorities.add(new SimpleGrantedAuthority(role.getName()));
	}
	return authorities;
}

@Override
public String getPassword() {
	// TODO Auto-generated method stub
	return this.password;
}

@Override
public String getUsername() {
	// TODO Auto-generated method stub
	return this.username;
}

@Override
public boolean isAccountNonExpired() {
	// TODO Auto-generated method stub
	return true;
}

@Override
public boolean isAccountNonLocked() {
	// TODO Auto-generated method stub
	return !locked;
}

@Override
public boolean isCredentialsNonExpired() {
	// TODO Auto-generated method stub
	return true;
}

@Override
public boolean isEnabled() {
	// TODO Auto-generated method stub
	return enabled;
}

}

////

public class Role {
	private Integer id;
	private String name;
	private String nameZh;
	
	public Role () {}

public Role(Integer id, String name, String nameZh) {
	super();
	this.id = id;
	this.name = name;
	this.nameZh = nameZh;
}

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

public String getNameZh() {
	return nameZh;
}

public void setNameZh(String nameZh) {
	this.nameZh = nameZh;
}
}

///

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoginContorller {
	
@RequestMapping("/hello")
public String hello() {
	return "hello world";
}

@RequestMapping("/admin/hello")
public String helloAdmin() {
	return "hello admin";
}

@RequestMapping("/user/hello")
public String helloUser() {
	return "hello user";
}

@RequestMapping("/db/hello")
public String helloDb() {
	return "hello db";
}

@RequestMapping("/login_page")
public String loginPage() {
	return "error";
}
}

Eso es todo! 0.0

Publicado 20 artículos originales · ganado elogios 5 · Vistas 2079

Supongo que te gusta

Origin blog.csdn.net/qq_42859887/article/details/103170559
Recomendado
Clasificación