【问题标题】:Spring-security-oauth OAuthProviderTokenServices custom implementation in OAuth 1.0OAuth 1.0 中的 Spring-security-oauth OAuthProviderTokenServices 自定义实现
【发布时间】:2013-08-29 20:49:12
【问题描述】:

我正在使用 Spring-security-oauth 来保护 RESTful 应用程序,并且我正在尝试实现自定义 OAuthProviderTokenServices 类以便将令牌存储在数据库中。 我从文档中得到的只是:

在创建 OAuthProviderTokenServices 实现时,您可以 想考虑扩展 RandomValueProviderTokenServices 通过随机值创建令牌并处理除 令牌的持久性。还有一个内存实现 可能适合的 OAuthProviderTokenServices [...]

这很好,所以我创建了一个新的自定义类:

package experiments;

import java.util.concurrent.ConcurrentHashMap;
import org.springframework.security.oauth.provider.token.OAuthProviderTokenImpl;
import org.springframework.security.oauth.provider.token.RandomValueProviderTokenServices;

/**
 * Implementation of TokenServices that stores tokens in a database.
 *
 * @author Seether
 */
public class DatabaseProviderTokenServices extends RandomValueProviderTokenServices {

  protected final ConcurrentHashMap<String, OAuthProviderTokenImpl> tokenStore = new ConcurrentHashMap<String, OAuthProviderTokenImpl>();

  protected OAuthProviderTokenImpl readToken(String token) {
    return tokenStore.get(token);
  }

  protected void storeToken(String tokenValue, OAuthProviderTokenImpl token) {
    tokenStore.put(tokenValue, token);
  }

  protected OAuthProviderTokenImpl removeToken(String tokenValue) {
    return tokenStore.remove(tokenValue);
  }

}

如您所见,它现在与 InMemoryProviderTokenServices 类相同。

我的应用程序使用 sparkl 示例中的 AccessConfirmationController,即:

package experiments;

import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.oauth.provider.ConsumerDetails;
import org.springframework.security.oauth.provider.ConsumerDetailsService;
import org.springframework.security.oauth.provider.token.OAuthProviderToken;
import org.springframework.security.oauth.provider.token.OAuthProviderTokenServices;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * Controller for retrieving the model for and displaying the confirmation page for access to a protected resource.
 * 
 * @author Ryan Heaton
 */
@Controller
public class AccessConfirmationController {

    private OAuthProviderTokenServices tokenServices;
    private ConsumerDetailsService consumerDetailsService;

    @RequestMapping("/oauth/confirm_access")
    public ModelAndView getAccessConfirmation(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String token = request.getParameter("oauth_token");
        if (token == null) {
            throw new IllegalArgumentException("A request token to authorize must be provided.");
        }

        OAuthProviderToken providerToken = tokenServices.getToken(token);
        ConsumerDetails consumer = consumerDetailsService
                .loadConsumerByConsumerKey(providerToken.getConsumerKey());

        String callback = request.getParameter("oauth_callback");
        TreeMap<String, Object> model = new TreeMap<String, Object>();
        model.put("oauth_token", token);
        if (callback != null) {
            model.put("oauth_callback", callback);
        }
        model.put("consumer", consumer);
        return new ModelAndView("access_confirmation", model);
    }

    public void setTokenServices(OAuthProviderTokenServices tokenServices) {
        this.tokenServices = tokenServices;
    }

    public void setConsumerDetailsService(ConsumerDetailsService consumerDetailsService) {
        this.consumerDetailsService = consumerDetailsService;
    }
}

现在的问题是:如何告诉我的应用程序使用我的 tokenServices 实现而不是默认实现(我现在相信是 InMemoryProviderTokenServices)?

我尝试弄乱控制器,但几次尝试都导致我遇到 java.lang.IllegalStateExceptions。

我还注意到配置 XML 中有一行:

<oauth:token-services id="tokenServices"/>

这可能是难题的关键部分,相关帮助如下:

用于声明和配置内存实现的元素 提供者令牌服务。

如果我只是删除它,我会得到:

org.springframework.beans.factory.BeanCreationException: 错误 创建名称为“accessConfirmationController”的bean ServletContext 资源 [/WEB-INF/mvc-dispatcher-servlet.xml]:不能 在设置 bean 属性时解析对 bean 'tokenServices' 的引用 '令牌服务';嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 定义了名为“tokenServices”的 bean

【问题讨论】:

    标签: java spring spring-mvc oauth


    【解决方案1】:

    有趣的是,有时答案不知从何而来,尤其是在您开始寻找答案并且刚刚在此处发布之后已经有一段时间了。哦,好吧。

    根据随机找到的代码sn-phere,看来我需要做的就是从XML配置文件中注释掉该行:

    <!--   <oauth:token-services id="tokenServices"/> -->
    

    并用这个替换它:

    <beans:bean id="tokenServices" class="experiments.DatabaseProviderTokenServices" />
    

    类当然是我的实现。 通过这样做,DatabaseProviderTokenServices 类被用来代替默认的 InMemoryProviderTokenServices 类。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2015-07-03
      • 2017-12-13
      • 2011-08-09
      • 2015-02-27
      • 2013-07-28
      • 2014-03-08
      • 2012-05-04
      • 2013-05-28
      相关资源
      最近更新 更多