当前位置: 首页 > news >正文

学校能建设网站吗万网 做网站

学校能建设网站吗,万网 做网站,小程序是怎么开发的,手机端移动网站建设我的Stateless Spring Security系列文章的第三部分也是最后一部分是关于将基于JWT令牌的身份验证与spring-social-security混合在一起的。 这篇文章直接建立在此基础上#xff0c;并且主要集中在已更改的部分上。 想法是使用基于OAuth 2的“使用Facebook登录”功能来替换基于用… 我的Stateless Spring Security系列文章的第三部分也是最后一部分是关于将基于JWT令牌的身份验证与spring-social-security混合在一起的。 这篇文章直接建立在此基础上并且主要集中在已更改的部分上。 想法是使用基于OAuth 2的“使用Facebook登录”功能来替换基于用户名/密码的登录但是此后仍使用相同的基于令牌的身份验证。 登录流程 客户端 用户单击“使用Facebook登录”按钮该按钮是指向“ / auth / facebook”的简单链接SocialAuthenticationFilter注意到缺少其他查询参数并触发了将您的网站用户重定向到Facebook的重定向。 他们使用用户名/密码登录然后重定向回“ / auth / facebook”但这一次指定了“code …state …”参数。 如果用户以前登录过facebook并设置了cookie那么facebook甚至会立即重定向回该用户并且根本不会向用户显示任何facebook屏幕。有趣的是您可以按照浏览器网络日志中的说明进行操作。所有操作均使用纯HTTP 302重定向完成。 HTTP响应中的“ Location”标头用于告诉浏览器下一步要去哪里 服务器端 从facebook重定向到“ / auth / facebookcode …state …”之后SocialAuthenticationFilter现在可以看到适当的参数并将触发两个服务器调用Facebook。 第一个是获取已登录用户的访问令牌第二个是通过使用访问令牌获取用户详细信息来测试整个过程是否成功。 完成所有这些操作后就认为用户已登录并且可以使用另一个302重定向到“ /”将其重定向回到应用程序的根目录。 关于Spring社交的一些话 Spring Social是用于处理社交网络的完整框架其范围远远超出了单纯的登录方案。 除了不同的社交网络适配器之外还有一个名为Spring Social Security的小型集成库该库以与Spring Security更好地集成的方式实现了社交身份验证用例。 它带有一个映射到“ / auth”的SocialAuthenticationFilter这就是我们将要使用的。 因此设置社交身份验证需要使用简洁的Spring Social Security库配置Spring Social本身以及Spring Security 。 Spring社交 配置它基本上涉及扩展SocialConfigurerAdapter。 首先您告诉它要支持哪些社交网络 将facebook添加为提供者 Override public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {cfConfig.addConnectionFactory(new FacebookConnectionFactory(env.getProperty(facebook.appKey),env.getProperty(facebook.appSecret))); } 它还需要知道如何获取当前用户的用户ID 检索UserId Override public UserIdSource getUserIdSource() {//retrieve the UserId from the UserAuthentication in security contextreturn new UserAuthenticationUserIdSource(); } 最后它需要一个UsersConnectionRepository。 基本上负责用户及其与社交网络的连接之间的关系。 Spring Social带有自己的两个实现jdbc或内存中。 我选择自己动手因为我想重用基于Spring Data JPA的UserDetailsS​​ervice。 自定义UsersConnectionRepository Override public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {SimpleUsersConnectionRepository usersConnectionRepository new SimpleUsersConnectionRepository(userService, connectionFactoryLocator);// if no local user record exists yet for a facebooks user id// automatically create a User and add it to the databaseusersConnectionRepository.setConnectionSignUp(autoSignUpHandler);return usersConnectionRepository; }Spring安全 如上一篇博客文章所述配置它基本上涉及扩展WebSecurityConfigurerAdapter。 除了配置和公开AuthenticationManager和UserDetailsS​​ervice之类的常规内容外它现在还需要配置和插入SocialAuthenticationFilter。 由于SpringSocialConfigurer完成了大部分工作因此这基本上只涉及很少的代码。 它可能很简单 Override protected void configure(HttpSecurity http) throws Exception {// apply the configuration from the socialConfigurer // (adds the SocialAuthenticationFilter)http.apply(new SpringSocialConfigurer()); } 考虑到我想插入基于令牌的身份验证我自己的succesHandler和userIdSource; 我必须进行一些配置更改 Autowired private SocialAuthenticationSuccessHandler successHandler; Autowired private StatelessAuthenticationFilter jwtFilter; Autowired private UserIdSource userIdSource;Override protected void configure(HttpSecurity http) throws Exception {// Set a custom successHandler on the SocialAuthenticationFilter (saf) final SpringSocialConfigurer sc new SpringSocialConfigurer(); sc.addObjectPostProcessor(new ObjectPostProcessor...() {Overridepublic ... O postProcess(O saf) {saf.setAuthenticationSuccessHandler(successHandler);return saf;} });http....// add custom authentication filter for stateless JWT based authentication .addFilterBefore(jwtFilter, AbstractPreAuthenticatedProcessingFilter.class)// apply the configuration from the SocialConfigurer .apply(sc.userIdSource(userIdSource)); } 如果您愿意还可以继承SpringSocialConfigurer的子类并为自定义的successHandler提供更优雅的设置器… 过去的样板在这里赞誉您 现在是时候关注一些更有趣的地方了。 在建立与Facebook的初始成功连接后立即触发自定义ConnectionSignUp Override Transactional public String execute(final Connection? connection) {//add new users to the db with its default rolesfinal User user new User();final String firstName connection.fetchUserProfile().getFirstName();user.setUsername(generateUniqueUserName(firstName));user.setProviderId(connection.getKey().getProviderId());user.setProviderUserId(connection.getKey().getProviderUserId());user.setAccessToken(connection.createData().getAccessToken());grantRoles(user);userRepository.save(user);return user.getUserId(); } 如您所见我的版本只是将用户的连接数据保留为单个JPA对象。 故意仅支持用户与Facebook上的身份之间的一对一关系。 请注意我最终从用户生成的实际令牌中排除了连接属性。 就像我之前排除了密码字段该字段不再是User对象的一部分一样 JsonIgnore private String accessToken; 走这条路线确实意味着对facebook API的任何调用都需要数据库查询其他连接字段。 稍后将对此进行更多介绍。 在用户通过身份验证之后立即触发自定义AuthenticationSuccessHandler Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) {// Lookup the complete User object from the databasefinal User user userService.loadUserByUsername(auth.getName());// Add UserAuthentication to the responsefinal UserAuthentication ua new UserAuthentication(user);tokenAuthenticationService.addAuthentication(response, ua);super.onAuthenticationSuccess(request, response, auth); } 这看起来很像以前的博客文章中的代码但是我必须在TokenAuthenticationService中进行一些更改。 由于客户端是在重定向之后加载的因此要在此之前在客户端保留令牌必须将其作为cookie发送给客户端 public void addAuthentication(HttpServletResponse response, UserAuthentication authentication) {final User user authentication.getDetails();user.setExpires(System.currentTimeMillis() TEN_DAYS);final String token tokenHandler.createTokenForUser(user);// Put the token into a cookie because the client cant capture response// headers of redirects / full page reloads. // (this response triggers a redirect back to /)response.addCookie(createCookieForToken(token)); } 最终成为最终重定向响应的一部分如下所示 成功登录后最终重定向回客户端 成功登录后最终重定向回客户端 最后也是最好的部分是所有代码结合在一起形成一个非常漂亮的API。 由于Spring Social已经负责创建用户特定的请求范围的ConnectionRepository因此可以通过将以下bean代码添加到SocialConfigurerAdapter来创建其特定于连接的API Bean Scope(value request, proxyMode ScopedProxyMode.INTERFACES) public Facebook facebook(ConnectionRepository repo) { ConnectionFacebook connection repo.findPrimaryConnection(Facebook.class);return connection ! null ? connection.getApi() : null; } 此用户特定的facebook bean可以在控制器中使用如下所示 Autowired Facebook facebook;RequestMapping(value /api/facebook/details, method RequestMethod.GET) public FacebookProfile getSocialDetails() {return facebook.userOperations().getUserProfile(); }客户端实施 如前所述令牌现在作为Cookie传递给客户端。 但是就像以前一样服务器端仍然只接受发送到特殊HTTP标头中的令牌。 承认这是相当随意的您可以让它简单地接受cookie。 我不希望这样做因为它可以防止CSRF攻击。 因为无法指示浏览器将正确的身份验证令牌自动添加到请求中。 因此在检索当前用户详细信息之前前端的init方法现在首先尝试将cookie移至本地存储 $scope.init function () {var authCookie $cookies[AUTH-TOKEN];if (authCookie) {TokenStorage.store(authCookie);delete $cookies[AUTH-TOKEN];}$http.get(/api/user/current).success(function (user) {if (user.username) {$rootScope.authenticated true;$scope.username user.username;// For display purposes only$scope.token JSON.parse(atob(TokenStorage.retrieve().split(.)[0]));}}); }; 自定义HTTP标头的放置在与上次相同的http拦截器中进行处理。 实际的“使用Facebook登录”按钮只是触发整个重定向狂潮的链接 a href/auth/facebookbuttonLogin with Facebook/button/a 为了检查实际的Facebook API是否有效我添加了另一个按钮用于在登录后显示来自facebook的用户详细信息。 最后的话建议 将我的自定义版本的JWT与社交身份验证集成在一起是一个很大的旅程。 有些部分不那么琐碎。 就像在将数据库调用卸载到JWT令牌之间找到一个很好的平衡。 最终我选择不与客户端共享Facebook的访问令牌因为只有在使用Facebook的API时才需要它。 这意味着对Facebook的任何查询都需要数据库调用来获取令牌。 实际上这意味着对具有Autowired Facebook服务的任何控制器的任何REST API调用都会导致获取请求令牌的过程非常热烈这是请求范围的Bean创建的一部分。 但是通过使用专用控制器进行Facebook调用可以轻松缓解这种情况但这绝对是需要注意的。 如果您打算实际使用此代码并进行Facebook API调用请确保您的JWT令牌在facebook令牌之前过期当前有效期为60天。 最好在检测到故障时实施强制重新登录因为任何重新登录都会自动将新获取的facebook令牌存储在数据库中。 您可以在github上找到完整的工作示例。 也可以在此处找到有关如何运行它的详细信息。 我已经包含了Maven和Gradle构建文件。 翻译自: https://www.javacodegeeks.com/2015/01/stateless-spring-security-part-3-jwt-social-authentication.html
http://www.zqtcl.cn/news/81590/

相关文章:

  • 网站建设实训周记网站群建设讲话
  • 江门网站建设联系电话定制开发小程序
  • 一些你不知道的网站搜云seo
  • 网站建设-信科网络摄影设计说明范文
  • 网站的友情链接做多少个比较合适厦门网站制作公司找哪家
  • 青岛网站改版开发公司工程部工作总结
  • 广宁城乡建设网站19互动网站建设
  • 阿里巴巴企业网站建设粉红色的网站首页
  • 西安汽车网站制作枸杞网站怎么做
  • 诸暨东莞网站建设公司成都网络公司网站建设
  • 珠海电商网站制作深圳网站建设公司制作定制
  • 保定网站设计优势南昌网站推广策划
  • 网站你懂我意思正能量免费app开发定制公司如何选择
  • 品牌建设标语欧美seo查询
  • 网站建设多少钱一年做购物网站用什么应用
  • 免费网站空间phpwordpress评论设置
  • 家电设计网站seo英文全称
  • 海外网站空间大连专业制作网站
  • 揭阳新站seo方案网络信息
  • 朝阳区互联网公司排名seo1网站查询
  • 广州网站建设服务商一起装修网官网
  • 佛山建设企业网站做站长工具网站
  • 龙胜做网站的公司网站注册费用需要多钱
  • 网站建设文字教程北京家装设计师排名
  • 一台电脑如何做网站wordpress回复页面
  • 网站开发全程设计新风格网站
  • 宿迁网站建设方案上海共有多少家企业
  • wamp在网站建设中的功能及协作关系wordpress 多条件
  • 前端做网站商城 购物车怎么做网站开发制作入什么科目
  • 有个做h手游的网站抖音代运营合作