springsecurity oauth2 整合 /oauth/token 如何返回自定义数据结构

现在,调用/oauth/token,返回:

图片说明

我想,返回自定义的数据如:

{
    "code":0,
    "msg":"no message",
    "result":{
        "jwt":"opooj90kkkllj"
    }
}

求教,如何实现,尝试了用springmvc的拦截器处理,发现拦截器不起作用。

2个回答

自定义一个登录成功处理器,在这个处理器里边返回就好了。

自己重新写一个登录接口,后端做一下请求转发,获得数据后重新包装一下
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用Spring security oauth2框架时,怎么接收额外的参数?

使用spring security oauth2框架完成验证授权时,我想添添加一个自定义参数,该怎么实现? --- ![图片说明](https://img-ask.csdn.net/upload/201810/22/1540195338_536644.jpg) * 正常情况下只传递3个值就可以获取token,但现在需求时要添加一个字段进来,即userid,可我尝试了网上的教程之后依旧没有成功的接收userid字段,请问这个问题怎么解决? ##### 两篇文章 * [Spring Security - Oauth2 Pass Request Paramerter to the AuthenticationProvider](https://stackoverflow.com/questions/40418821/spring-security-oauth2-pass-request-paramerter-to-the-authenticationprovider# "") * [Oauth 2 - How to Capture Custom User Parameters During Authorization](http://forum.spring.io/forum/spring-projects/security/oauth/126371-oauth-2-how-to-capture-custom-user-parameters-during-authorization)

关于spring Security OAuth2 生成Token和Jwt的问题

![图片说明](https://img-ask.csdn.net/upload/201805/29/1527563054_268262.png) 途中要求生成token和jwt,然后通过token换取jwt,求大神告知如何操作,最好有个demo,

Spring security Oauth2 自定义拦截器如何在验证token之前执行?

想通过拦截器的方式把所有的请求 带一个token过去 然后再去验证。 现在问题是没有等到我的拦截器执行就报401了 无权限了。 ``` @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) @Order(-1) public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private SuccessAuthenticationSuccessHandler successAuthenticationSuccessHandler; @Bean public BCryptPasswordEncoder passwordEncoder() { // 设置默认的加密方式 return new BCryptPasswordEncoder(); } @Bean @Override public UserDetailsService userDetailsService() { return new UserDetailsServiceImpl(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 使用自定义认证与授权 auth.userDetailsService(userDetailsService()); } @Override public void configure(WebSecurity web) throws Exception { // 将 check_token 暴露出去,否则资源服务器访问时报 403 错误 web.ignoring().antMatchers("/oauth/check_token"); } @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Override protected void configure(HttpSecurity http) throws Exception { //自定义TokenFilter 不执行为什么? http.addFilterAt(new TokenFilter(), FilterSecurityInterceptor.class); http.requestMatchers().antMatchers(HttpMethod.OPTIONS, "/oauth/token") .and() .cors() .and() .csrf().disable(); } ``` ``` @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Autowired private AdminPermissionRepository adminPermissionRepository; @Autowired private SuccessAuthenticationSuccessHandler successAuthenticationSuccessHandler; @Override public void configure(HttpSecurity http) throws Exception { List<AdminPermission> permissions = adminPermissionRepository.findAll(); http .headers().frameOptions().sameOrigin(); http .exceptionHandling() .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/","/login","/static/**","/assets/**").permitAll(); permissions.forEach(permission->{ try { http.authorizeRequests().antMatchers(permission.getUrl()).hasAuthority(permission.getNameEn()); } catch (Exception e) { e.printStackTrace(); } }); } @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { super.configure(resources); } } ```

Spring oauth2 项目搭建postman调用获取token报401

![图片说明](https://img-ask.csdn.net/upload/201909/03/1567476220_665579.jpg) ![图片说明](https://img-ask.csdn.net/upload/201909/03/1567476250_545158.jpg) 请问这种情况是由于什么问题导致的?请问spring oauth2 认证服务中心有官方实例吗?我一直没有找到

spring security oauth2 的一个问题 求大神指点

在oauth2根据授权码获取accsess token时,通关Debug发现在TokenEndpoint类下的getAccessToken方法内会根据principal去数据库获取client_id,但principal内存储的是当前用户的信息,然后就会报错:Given client ID does not match authenticated client 求大神解答怎么破. security.xml文件如下: ``` <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth2="http://www.springframework.org/schema/security/oauth2" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <!-- 指定不需要权限过滤的路径 --> <http pattern="/login.jsp" security="none" /> <http pattern="/aouth/token" create-session="stateless" authentication-manager-ref="oauth2AuthenticationManager" entry-point-ref="oauth2AuthenticationEntryPoint"> <!-- 设置拦截地址和规则 --> <intercept-url pattern="/aouth/token" access="IS_AUTHENTICATED_FULLY" /> <!-- 非匿名 --> <anonymous enabled="false" /> <http-basic entry-point-ref="oauth2AuthenticationEntryPoint" /> <!-- 设置过滤链 --> <custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> <!-- 拒绝访问处理 --> <access-denied-handler ref="oauthAccessDeniedHandler" /> </http> <!--一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性, 我们的所有控制将在这三个类中实现 --> <beans:bean id="myFilter" class="com.yichi.mvcm.filter.MyFilterSecurityInterceptor"> <beans:property name="authenticationManager" ref="authenticationManager" /> <beans:property name="accessDecisionManager" ref="myAccessDecisionManagerBean" /> <beans:property name="securityMetadataSource" ref="myInvocationSecurityMetadataSource" /> </beans:bean> <!-- 认证客户端的manager --> <authentication-manager id="oauth2AuthenticationManager"> <authentication-provider user-service-ref="oauth2ClientDetailsUserService" /> </authentication-manager> <!-- spring security提供的用户登录验证 ,alias的值对应上面的ref="authenticationManager" --> <authentication-manager alias="authenticationManager"> <!--userDetailServiceImpl 获取登录的用户、用户权限 --> <authentication-provider user-service-ref="myUserDetailService" /> <!-- 缓存 --> <!-- <authentication-provider user-service-ref="cachingUserDetailsService" /> --> </authentication-manager> <!-- 缓存 --> <!-- <beans:bean id="cachingUserDetailsService" class="org.springframework.security.config.authentication.CachingUserDetailsService"> <beans:constructor-arg ref="myUserDetailService" /> 缓存UserDetails的UserCache <beans:property name="userCache" ref="userCache"/> </beans:bean> <beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache"> 用于真正缓存的Ehcache对象 <beans:property name="cache" ref="ehcache4UserDetails"></beans:property> </beans:bean> <beans:bean id="ehcache4UserDetails" class="org.springframework.cache.ehcache.EhCacheFactoryBean" /> --> <!--在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等 --> <beans:bean id="myUserDetailService" class="com.yichi.mvcm.filter.MyUserDetailService"> <!-- 配置成员变量 --> <beans:property name="sysUserService" ref="sysUserService" /> </beans:bean> <!--访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源 --> <beans:bean id="myAccessDecisionManagerBean" class="com.yichi.mvcm.filter.MyAccessDecisionManager"> </beans:bean> <beans:bean id="sysResService" class="com.yichi.mvcm.service.sys.SysResService"></beans:bean> <!--资源源数据定义,将所有的资源和权限对应关系建立起来,即定义某一资源可以被哪些角色访问 --> <beans:bean id="myInvocationSecurityMetadataSource" class="com.yichi.mvcm.filter.MyInvocationSecurityMetadataSource"> <!-- 配置成员变量 --> <beans:constructor-arg> <beans:ref bean="sysResService" /> </beans:constructor-arg> </beans:bean> <!-- 配置client客户端信息 --> <authentication-manager id="clientAuthenticationManager"> <authentication-provider user-service-ref="oauth2ClientDetailsUserService" /> </authentication-manager> <beans:bean id="oauth2ClientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService"> <beans:constructor-arg ref="clientDetailsService" /> </beans:bean> <!-- 数据库读取客户端信息 --> <beans:bean id="clientDetailsService" class="com.yichi.mvcm.filter.CustomJdbcClientDetailsService"> <beans:constructor-arg index="0" ref="dataSource" /> </beans:bean> <!-- 资源filter配置 --> <oauth2:resource-server id="picResourceServer" resource-id="pic-resource" token-services-ref="tokenServices" /> <!-- 配token service用于生成访问令牌token --> <beans:bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices"> <beans:property name="tokenStore" ref="tokenStore" /> <!-- 是否生成更新令牌 默认为false --> <beans:property name="supportRefreshToken" value="true" /> <beans:property name="clientDetailsService" ref="clientDetailsService" /> </beans:bean> <!-- token仓库 可以选择存储在内存或者数据库 --> <!-- <beans:bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore"> </beans:bean> --> <beans:bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.store.JdbcTokenStore"> <beans:constructor-arg index="0" ref="dataSource" /> </beans:bean> <!-- 资源 --> <http pattern="/mvcm/**" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint" access-decision-manager-ref="oauth2AccessDecisionManager"> <anonymous enabled="false" /> <intercept-url pattern="/mvcm/**" access="ROLE_index,SCOPE_READ" /> <custom-filter ref="picResourceServer" before="PRE_AUTH_FILTER" /> <access-denied-handler ref="oauthAccessDeniedHandler" /> </http> <beans:bean id="oauth2AuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint" /> <beans:bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" /> <beans:bean id="oauth2AccessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased"> <beans:constructor-arg> <beans:list> <beans:bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" /> <beans:bean class="org.springframework.security.access.vote.RoleVoter" /> <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> </beans:list> </beans:constructor-arg> </beans:bean> <!-- user-approval-page:用户第三方登录认证以后的授权确认页面 error-page : 客户端申请授权的数据与服务端的不相同时跳转的页面 --> <oauth2:authorization-server client-details-service-ref="clientDetailsService" token-services-ref="tokenServices" user-approval-handler-ref="oauthUserApprovalHandler" user-approval-page="oauth_approval" error-page="oauth_error"> <oauth2:authorization-code authorization-code-services-ref="authorizationCodeServices" /> <oauth2:implicit /> <oauth2:refresh-token /> <oauth2:client-credentials /> <oauth2:password /> </oauth2:authorization-server> <!-- 授权码存储到数据库 --> <beans:bean id="authorizationCodeServices" class="org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices"> <beans:constructor-arg index="0" ref="dataSource" /> </beans:bean> <beans:bean id="oauthUserApprovalHandler" class="org.springframework.security.oauth2.provider.approval.DefaultUserApprovalHandler" /> <!-- <beans:bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter"> <beans:property name="authenticationManager" ref="clientAuthenticationManager" /> </beans:bean> --> <beans:bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter"> <beans:property name="authenticationManager" ref="clientAuthenticationManager" /> </beans:bean> <http auto-config="true" use-expressions="true"> <!-- 没有权限时跳转的页面 --> <access-denied-handler error-page="/accessDenied.jsp" /> <!-- 使用自定义的登录页面 login_page:指定登录页面 authentication-failure-url:登录失败跳转到/login.jsp login-processing-url进行认证拦截的请求路径 username-parameter和 password-parameter指定属性name字段 default-target-url认证成功默认跳转页面 --> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=1" login-processing-url="/springSecurity" username-parameter="account" password-parameter="password" default-target-url="/index.jsp" /> <intercept-url pattern="/oauth/**" access="hasRole('ROLE_userOrg')" /> <!-- 设置单用户登录 --> <session-management> <!-- max-sessions表示最多允许多少次重复登录。如果没有配置error-if-maximum-exceeded, 那么用户账号的第二次登录会使第一次登录失效,而配置了的话,那么第二次登录会被阻止。 通常的做法是阻止第二次登录。 --> <concurrency-control max-sessions="1" error-if-maximum-exceeded="false" /> </session-management> <custom-filter ref="myFilter" before="FILTER_SECURITY_INTERCEPTOR" /> <!-- 检测失效的sessionId,session超时时,定位到另外一个URL --> <session-management invalid-session-url="/login.jsp" /> <logout invalidate-session="true" logout-success-url="/" logout-url="/logout" /> </http> </beans:beans> ```

spring security和spring oauth结合后 spring security配置不管用了

> spring security ``` @Configuration @EnableResourceServer public class AppWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired private ZuulProperties zuulProperties; @Autowired private AuthenticationSuccessHandler appAuthenticationSuccessHandler; @Autowired private AuthenticationFailureHandler appAuthenticationFailureHandler; @Autowired private AccessDeniedHandler appAccessDeniedHandler; @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { AuthenticationManager manager = super.authenticationManagerBean(); return manager; } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(HttpMethod.GET,zuulProperties.getAuth().toGetAdapter()) .permitAll() .and() .authorizeRequests() .antMatchers(HttpMethod.POST,zuulProperties.getAuth().toPostAdapter()) .permitAll() .and() .authorizeRequests() .anyRequest() .authenticated() .and() .exceptionHandling().accessDeniedHandler(appAccessDeniedHandler) .and() .csrf().disable(); } ``` > spring oauth相关 ``` @Configuration @EnableAuthorizationServer public class AppAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private final AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; @Autowired private ZuulProperties zuulProperties; @Autowired private TokenStore tokenStore ; @Autowired(required = false) private JwtAccessTokenConverter jwtAccessTokenConverter; @Autowired(required = false) private TokenEnhancer jwtTokenEnhancer; @Autowired private PasswordEncoder passwordEncoder; public AppAuthorizationServerConfig(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { InMemoryClientDetailsServiceBuilder builder = clients.inMemory(); OAuth2ClientProperties[] clientProperties = zuulProperties.getOauth().getClients(); if(ArrayUtils.isNotEmpty(zuulProperties.getOauth().getClients())) { for (OAuth2ClientProperties oAuth2ClientProperties : clientProperties) { builder.withClient(oAuth2ClientProperties.getClientId()) .secret(oAuth2ClientProperties.getClientSecret()) //token有效时间 .accessTokenValiditySeconds(oAuth2ClientProperties.getAccessTokenValiditySeconds()) //验证模式 .authorizedGrantTypes("password","authorization_code","client_credentials","implicit","refresh_token") //刷新时间 .refreshTokenValiditySeconds(3600*24*100) //跳转地址 .redirectUris("ws.28ph.cn") //权限 .scopes("all"); } } } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager) .tokenStore(tokenStore) .userDetailsService(userDetailsService) .reuseRefreshTokens(true); if(jwtAccessTokenConverter != null && jwtTokenEnhancer!=null) { TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); List<TokenEnhancer> tokenEnhancers = new ArrayList<>(); tokenEnhancers.add(jwtTokenEnhancer); tokenEnhancers.add(jwtAccessTokenConverter); enhancerChain.setTokenEnhancers(tokenEnhancers); endpoints .tokenEnhancer(enhancerChain) .accessTokenConverter(jwtAccessTokenConverter); } } @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security.allowFormAuthenticationForClients() .passwordEncoder(passwordEncoder) .tokenKeyAccess("permitAll()") .checkTokenAccess("isAuthenticated()"); } } ``` 问题的产生:我在spring security配置了几个不需要拦截的uri,但是加入spring oauth 全部被拦截了,如果删掉@EnableResourceServer会出现 发出来的token 认证不了url的问题。。 然后我想大不了不用spring oauth 自带的发token方式。然后我在spring security的成功handler上下发token ,以下是代码 ``` /** * 认证成功跳转 * @author w4837 * */ @Component(value = "AppAuthenticationSuccessHandler") @Slf4j public class AppAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Autowired private ObjectMapper objectMapper; @Autowired private ClientDetailsService clientDetailsService; @Autowired private AuthorizationServerTokenServices authorizationServerTokenServices; @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { log.info("登陆成功"); String header = httpServletRequest.getHeader("Authorization"); //请求头包含Authorization 并且以"Basic "开始 if (header == null || !header.startsWith("Basic ")) { throw new UnapprovedClientAuthenticationException("请求头中无Authorization信息"); } try { String[] tokens = extractAndDecodeHeader(header, httpServletRequest); assert tokens.length == 2; String clientId = tokens[0]; String clientSecret = tokens[1]; ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); if(clientDetails == null) { throw new UnapprovedClientAuthenticationException("clientId:"+clientId+"对应的信息不存在。"); }else if(!StringUtils.equals(clientSecret, clientDetails.getClientSecret())) { throw new UnapprovedClientAuthenticationException("clientId:"+clientId+"对应的信息不匹配。"); } @SuppressWarnings("unchecked") TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(),"custom"); OAuth2Request auth2Request = tokenRequest.createOAuth2Request(clientDetails); OAuth2Authentication auth2Authentication = new OAuth2Authentication(auth2Request, authentication); OAuth2AccessToken createAccessToken = authorizationServerTokenServices.createAccessToken(auth2Authentication); // 判断需要的返回类型 httpServletResponse.setContentType(ZuulAppConstant.CONTENT_TYPE_JSON); httpServletResponse.getWriter().write(objectMapper.writeValueAsString(createAccessToken)); } catch (Exception e) { log.error(e.getMessage()); } } /** * 解析header中编码后的数据 * * @param header * @param request * @return * @throws IOException */ private String[] extractAndDecodeHeader(String header, HttpServletRequest request) throws IOException { byte[] base64Token = header.substring(6).getBytes("UTF-8"); byte[] decoded; try { decoded = Base64.decode(base64Token); } catch (IllegalArgumentException e) { throw new BadCredentialsException("Failed to decode basic authentication token"); } String token = new String(decoded, "UTF-8"); int delim = token.indexOf(":"); if (delim == -1) { throw new BadCredentialsException("Invalid basic authentication token"); } return new String[] { token.substring(0, delim), token.substring(delim + 1) }; } ``` 结果 启动还是报循环依赖的错误 ``` *************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | appAuthorizationServerConfig defined in file [F:\yulece_aike_ideaword\app-management\app-management-zuul\target\classes\com\yulece\app\management\zuul\authorization\AppAuthorizationServerConfig.class] ↑ ↓ | appWebSecurityConfigurerAdapter (field private org.springframework.security.web.authentication.AuthenticationSuccessHandler com.yulece.app.management.zuul.authorization.AppWebSecurityConfigurerAdapter.appAuthenticationSuccessHandler) ↑ ↓ | AppAuthenticationSuccessHandler (field private org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices com.yulece.app.management.zuul.authorization.handler.AppAuthenticationSuccessHandler.defaultAuthorizationServerTokenServices) ↑ ↓ | org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerEndpointsConfiguration (field private java.util.List org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerEndpointsConfiguration.configurers) └─────┘ ```

spring-curl-oauth-token,但是利用token访问路径,显示未认证?

利用spring-security-oauth去做token验证,通过curl请求,已经得到token了,返回 结果如下 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Frame-Options: DENY X-Application-Context: user:0 Cache-Control: no-store Pragma: no-cache Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Wed, 11 Jan 2017 02:35:18 GMT {"access_token":"XXXX","token_type":"bearer"," pires_in":2520040,"scope":"app"} 然后利用curl请求到的token去访问路径 curl -d "Authorization: bearer XXXX" localhost:8080/api 返回结果如下 curl -X -H "Authorization: bearer XXXX" localhost:8080/api/register curl: (3) Illegal port number <UnauthorizedException><error>unauthorized</error><error_description>Full authen tication is required to access this resource</error_description></UnauthorizedEx ception> 已经请求到token了,利用curl token(post请求)为什么还会未认证?请求道token不是已经完成认证了吗?

Spring Security OAuth2 请求报错

提示找不到请求类型 Handling error: InvalidRequestException, Missing grant type ![图片说明](https://img-ask.csdn.net/upload/201908/26/1566820213_702119.png) ![图片说明](https://img-ask.csdn.net/upload/201908/26/1566820222_335803.png) https://pan.baidu.com/s/1Pvb35lZeMyDx_JhVc1qzBA

用spring-security-oauth2实现单点登录后,如果是前后端分离通过ajax跨域访问该怎么办?

如题,使用spring-security-oauth2实现单点登录后,我有一个前端服务器,通过JS到认证服务器通过认证后能正常访问其它后端服务器接口。但是如果使用ajax就访问不了。 ``` crossDomain:true, xhrFields:{ withCredentials:true }, ``` 网上查了很多资料,跨域访问的时候带上cookie,后端服务器允许跨域访问带cookie,如下: ``` res.setHeader("Access-Control-Allow-Credentials","true"); ``` 但是这样访问有一个前题,就是前端服务器必须正常访问过后端服务器,前端服务器的域里已经有能正常访问后端服务器的cookie才能正常访问。 有没有办法能够直接实现我需要的功能?

Spring Security OAuth2

在使用Spring Security OAuth2测试时,授权之后报错: Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Dec 20 16:14:18 CST 2017 There was an unexpected error (type=Unauthorized, status=401). Authentication Failed: Could not obtain user details from token 客户端DEBUG信息: 2017-12-20 16:14:17.948 DEBUG 7932 --- [nio-8082-exec-4] o.s.s.oauth2.client.OAuth2RestTemplate : Created GET request for "http://localhost:8081/resource/user" 2017-12-20 16:14:17.967 DEBUG 7932 --- [nio-8082-exec-4] o.s.s.oauth2.client.OAuth2RestTemplate : Setting request Accept header to [application/json, application/*+json] 2017-12-20 16:14:18.204 DEBUG 7932 --- [nio-8082-exec-4] o.s.s.oauth2.client.OAuth2RestTemplate : GET request for "http://localhost:8081/resource/user" resulted in 401 (null); invoking error handler 2017-12-20 16:14:18.213 WARN 7932 --- [nio-8082-exec-4] o.s.b.a.s.o.r.UserInfoTokenServices : Could not fetch user details: class org.springframework.security.oauth2.common.exceptions.InvalidRequestException, Possible CSRF detected - state parameter was required but no state could be found 2017-12-20 16:14:18.280 DEBUG 7932 --- [nio-8082-exec-4] uth2ClientAuthenticationProcessingFilter : Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Could not obtain user details from token 认证服务器DEBUG信息: 2017-12-20 16:14:08.230 DEBUG 8704 --- [nio-8080-exec-7] o.s.s.w.a.i.FilterSecurityInterceptor : Secure object: FilterInvocation: URL: /favicon.ico; Attributes: [authenticated] 2017-12-20 16:14:08.230 DEBUG 8704 --- [nio-8080-exec-7] o.s.s.w.a.i.FilterSecurityInterceptor : Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6fa90ed4: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffc7f0c: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 41D379AFB367FD4316A06BAC18AB91DA; Granted Authorities: ROLE_ANONYMOUS 2017-12-20 16:14:08.230 DEBUG 8704 --- [nio-8080-exec-7] o.s.s.access.vote.AffirmativeBased : Voter: org.springframework.security.web.access.expression.WebExpressionVoter@72127537, returned: -1 2017-12-20 16:14:08.231 DEBUG 8704 --- [nio-8080-exec-7] o.s.s.w.a.ExceptionTranslationFilter : Access is denied (user is anonymous); redirecting to authentication entry point 资源服务器DEBUG信息: 2017-12-20 16:14:18.132 DEBUG 10100 --- [nio-8081-exec-1] o.s.security.web.FilterChainProxy : /user at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2AuthenticationProcessingFilter' 2017-12-20 16:14:18.137 DEBUG 10100 --- [nio-8081-exec-1] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Invalid access token: fbde02a4-d6b9-41c8-a8aa-332390482c1e" 2017-12-20 16:14:18.192 DEBUG 10100 --- [nio-8081-exec-1] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 2017-12-20 16:14:18.199 DEBUG 10100 --- [nio-8081-exec-1] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error="invalid_token", error_description="Invalid access token: fbde02a4-d6b9-41c8-a8aa-332390482c1e"] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@74bcb39b] 2017-12-20 16:14:18.200 DEBUG 10100 --- [nio-8081-exec-1] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed 网上找了很久都没有解决,有研究过的大神指教一下

spring cloud oauth2 自定义错误。

最近在研究spring cloud oauth2,通过百度,重写了/oauth/token接口,正常情况下可以获取到自定义的返回格式。 但是当client_id或者client_secret错误的时候没办法返回自定义错误,始终是 ``` { "error": "invalid_client", "error_description": "Bad client credentials" } ``` 求此题解法

Spring Security OAuth2 请求类型不能为空

![图片说明](https://img-ask.csdn.net/upload/201908/26/1566819847_641230.png) ![图片说明](https://img-ask.csdn.net/upload/201908/26/1566819867_243294.png)

急:使用springsecurity+oauth2+jwt认证服务器和资源服务器在同一个服务中,jwt使用的非对称加密,应该怎么配置该模块?

使用springsecurity+oauth2+jwt认证服务器和资源服务器在同一个服务中,jwt使用的非对称加密,应该怎么配置该模块。请大佬提供解决思路,万分感谢

基于springboot实现security-oauth2.0客户端模式token验证?

项目是基于spring springboot去实现的。现在要利用security-oauth2.0去实现token验证 以免其他人随意调用,基本拦截配置已经完成了。但是token怎么生成呢?怎么去写token 的这个接口呢?本人是新手不是很熟悉,试着很多相关demo,也看了官方文档,但是还是 懵懂状态,希望大神能给个详细的解释,能给一个例子就更好了,谢谢了

jwt 和 spring security 和 oauth2.0 还有shiro的各种区别和作用?

jwt 和 spring security 和 oauth2.0 还有shiro的各种区别和作用?

spring oauth2 资源服务器问题

我定义了三个类 ``` @Configuration @EnableWebSecurity public class BCSecurityConfig extends WebSecurityConfigurerAdapter{ @Autowired private DataSource dataSource; @Override public void configure(HttpSecurity http) throws Exception { super.configure(http); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource); } } ``` 另外两个是认证服务器 ``` @Configuration @EnableAuthorizationServer public class BCAuthorizationServerConfig { } ``` 和资源服务器 ``` @Configuration @EnableResourceServer public class BCResourceServerConfig extends ResourceServerConfigurerAdapter{ @Override public void configure(HttpSecurity http) throws Exception { //表单登录 方式 http.formLogin().and() .authorizeRequests() .antMatchers("/api/**") .authenticated() .antMatchers("/oauth/token").permitAll() .and() .csrf().disable(); } } ``` 有一个问题就是,当你配置了资源服务器的时候访问需要认证的链接返回的是 ![图片说明](https://img-ask.csdn.net/upload/201812/21/1545387960_106340.jpg) 这是没有问题的,但是我想实现的是当你在没有认证的情况下访问其他的链接的时候自动跳转到登录页,也就是我想让BCResourceServerConfig资源服务器不处理的链接交给我配置的BCSecurityConfig这个类处理?请问怎么实现呢,请不吝赐教不胜感激!!! 我的最终目的是它既能提供安全的网页服务(登陆验证)!又能够通过oauth提供token

springboot oauth2.0 实现token的Authentication 验证?

项目基于spring springboot,利用oauth2去实现一个token的Authentication 验证,采取 clientcredetails,利用clientid clientsecret还有grant_type=clientcredetails去请求 oauth/token,那么这里面的clientID和clientSecret是怎么来的呢,是由后端去随机生成的吗,如果是这样的话,需要怎么做呢?如果不是,那他是怎么生成的呢?也是有Authentication 的接口去生成的吗?本人刚刚接触不是很懂希望大神指教一下,麻烦不要推荐文章,因为看了很多,现在自己有点迷茫,希望大神能借助自己的语言帮忙解答一下小弟的问题,谢谢了!

Spring Security OAuth2 找不到类型

![图片说明](https://img-ask.csdn.net/upload/201908/26/1566820448_485922.png) 错误提示 2019-08-26 19:45:19.912 WARN 2836 --- [nio-8099-exec-4] o.s.s.o.provider.endpoint.TokenEndpoint : Handling error: InvalidRequestException, Missing grant type

oauth2返回自定义数据格式

oauth2 如何自定义 返回数据格式 成功失败都想自定义。

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐