Get、Post、Put
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Get、Post、Put相关的知识,希望对你有一定的参考价值。
参考技术A post、delete、put、get 对应我们常用的增、删、改、查。而post可以做到其余的所有操作,为什么这4个要有区分呢。post和get
1、用get想服务器请求数据,浏览器会自动缓存数据,而post请求不会被自动缓存,需要特殊设置
2、GET 请求参数会保留在浏览器历史记录中,POST 请求参数不会保留在浏览器历史记录中
3、GET 请求可被收藏为书签,POST 不能被收藏为书签
4、GET 请求有长度限制,POST 请求对数据长度没有要求
5、GET请求提交的数据是在URL中以键值对形式发送的,而POST请求是在HTTP 消息主体中以键值对的形式发送的,因为GET参数可见,所以相对没那么安全
post和put
在HTTP中,PUT被定义为一个幂等的方法,而POST则不是,这个非常重要
keycloak 中基于 GET 、 POST 、 PUT 、 DELETE 类型的身份验证
【中文标题】keycloak 中基于 GET 、 POST 、 PUT 、 DELETE 类型的身份验证【英文标题】:GET , POST , PUT , DELETE type based Authentication in keycloak 【发布时间】:2019-09-14 13:31:04 【问题描述】:我在 API 中有一个资源,其 URI 为 /product/id
,并在 HttpMethod
基础上执行三个操作 VIEW, GET, DELETE
。
如何管理一个用户只允许VIEW
和admin
允许VIEW, GET, DELETE
即所有选项。
我见过Keycloak Adapter Policy Enforcer
,但是我不明白它是如何工作的。
我没有在创建权限中获得方法选项。
有人可以帮我实现这个或建议一些方法来做到这一点。
【问题讨论】:
您想在哪里放置您的授权?在数据库中?然后你想在运行时确定谁可以做什么? 不,我想将我的授权放在 url 和 method type 中。如果我将使用与 /products/id 相同的 url 进行编辑、删除和获取单个产品。对于编辑方法类型,方法类型不同,对于删除,我使用了方法类型删除,那么我如何使用 keycloak 管理授权。我已经实现了基于角色的身份验证但现在我想要基于 uri 的身份验证 【参考方案1】:首先,最合适的选择是使用基于注释的策略机制。 所以在每一个休息服务之前,你需要编写它的访问策略,例如:
@Secured("ROLE_VIEWER")
public String getUsername()
SecurityContext securityContext = SecurityContextHolder.getContext();
return securityContext.getAuthentication().getName();
如您所见,getUsername() 方法将只被查看器允许。
@Secured("ROLE_ADMIN")
public boolean isValidUsername(String username)
return userRoleRepository.isValidUsername(username);
所以你看到上面的方法只允许管理员访问,同样的注解也可以用于其他服务。要使用这种功能,您需要将 Spring Security 与您的 Spring Boot 应用程序集成。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
有关更多详细信息,您可以查看这篇文章,但我确实认为这是在 Spring Boot 应用程序中控制数据安全性和服务安全性的最佳方式。
参考:https://www.baeldung.com/spring-security-method-security
【讨论】:
谢谢!但我不想要基于角色的 Authantication 。我想要基于 URL 和方法类型的身份验证。【参考方案2】:您需要的是弹簧安全性。您可以使用以下方法将其添加到您的项目中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
您可以像这样定义您的安全设置(我假设其他配置已经完成):
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
// ...
@Override
protected void configure(HttpSecurity http) throws Exception
http
//HTTP Basic authentication
.httpBasic()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/product/**").hasRole("USER")
.antMatchers(HttpMethod.POST, "/product").hasRole("ADMIN")
.antMatchers(HttpMethod.PUT, "/product/**").hasRole("ADMIN")
.antMatchers(HttpMethod.PATCH, "/product/**").hasRole("ADMIN")
.antMatchers(HttpMethod.DELETE, "/product/**").hasRole("ADMIN")
.and()
.csrf().disable()
.formLogin().disable();
【讨论】:
不,这不是 SO 用户想要的。根据您的代码,只有 USER 可以访问/product/**
和 GET
。管理员将无法执行GET
,这不是用户想要的功能。【参考方案3】:
我猜你安装 Keycloak 是因为它不仅可以控制身份验证,还可以控制授权。那么你根本不需要弹簧安全。您需要为您的客户端启用授权并使用 Keycloak 管理控制台配置资源、策略和权限。这里是documentation
为了能够更精细地控制您的资源,请使用策略实施器并将 HTTP 方法映射到此处所述的范围:How to add HTTP methods in Keycloak resources for Authorization (Without adapters)。
值得一看的好例子之一是authz-spring-boot。具有完整的授权流程,但没有方法限制,可以手动添加。
您还可以使用 Keycloak 上的“评估”选项卡检查您的政策是如何运作的。这会模拟客户端对资源的调用并显示结果
【讨论】:
方法 + URI 未在文档中提及。你能举个例子吗? 首先,您应该为您的客户端启用授权。然后出现“授权”菜单。其次,你去授权->资源->创建新过滤器。在 Filter URIS 下,您可以放置 URI + 方法。例如“POST /api/*”。在操作下,您将定义相关的权限。例如可以执行此 POST 的用户或组 非常有用的功能是“评估”菜单。使用它进行测试。您可以选择用户、客户端、资源并查看它是否通过您的规则。 文档中确实没有提到这一点,但我在示例中的某个地方找到了它。经过测试,它工作正常。 抱歉回复晚了,@RicardoCampos。我仔细检查了这个例子,发现我的回答并不完全正确。要定义资源方法授权,您首先需要启用策略实施器,如此处所述***.com/questions/62323931/… 然后您可以将方法定义为客户端->授权-授权范围的范围之后,您可以将此范围与 URI 一起使用,以基于 HTTP 过滤您的请求方法【参考方案4】:我也遇到了同样的问题。以下answer 提供了解释。
因此,您可以将 HTTP 方法定义为范围并通过 following Keycloak API 检查权限。
curl -X POST \
http://$host:$port/auth/realms/$realm/protocol/openid-connect/token \
-H "Authorization: Bearer $access_token" \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "audience=resource_server_client_id" \
--data "permission=Resource A#GET"
【讨论】:
以上是关于Get、Post、Put的主要内容,如果未能解决你的问题,请参考以下文章
OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )