Spring Security Oauth2 自定义 OAuth
2020-08-06 本文已影响0人
King斌
AuthenticationEntryPoint 用来解决匿名用户访问无权限资源时的异常
AccessDeineHandler 用来解决认证过的用户访问无权限资源时的异常
配置类:在资源服务器中配置
@Configuration
@EnableResourceServer // 开启资源服务器
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(6)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public TokenStore tokenStore() {
// 基于 JDBC 实现,令牌保存到数据库
//return new JdbcTokenStore(dataSource);
// 基于redis 实现, 令牌保存到redis
return new RedisTokenStore(redisConnectionFactory);
}
@Bean
MyAuthenticationEntryPoint myAuthenticationEntryPoint() {
return new MyAuthenticationEntryPoint();
}
@Bean
MyAccessDeniedHandler myAccessDeniedHandler() {
return new MyAccessDeniedHandler();
}
@Override
public void configure(HttpSecurity http) {
// 省略
}
@Override
public void configure(ResourceServerSecurityConfigurer resource) {
//这里把自定义异常加进去
resource.tokenStore(tokenStore).authenticationEntryPoint(myAuthenticationEntryPoint())
.accessDeniedHandler(myAccessDeniedHandler());
}
}
之后,自定义AuthenticationEntryPoint的实现类:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import com.alibaba.fastjson.JSONObject;
import com.panku.common.domain.RestMsg;
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/javascript;charset=utf-8");
response.getWriter().print(JSONObject.toJSONString(RestMsg.error("没有访问权限!")));
}
}
自定义,AccessDeineHandler:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import com.alibaba.fastjson.JSONObject;
import com.panku.common.domain.RestMsg;
public class CustomAccessDeineHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/javascript;charset=utf-8");
response.getWriter().print(JSONObject.toJSONString(RestMsg.error("没有访问权限!")));
}
}