我想让客户端对 jhipster 生成的 Web 应用程序进行 REST 调用。 我似乎错过了一些信息来做到这一点。
我发现在 application.yml 中我需要启用 cors 选项。 所以我取消了以下注释:
jhipster:
cors: #By default CORS are not enabled. Uncomment to enable.
allowed-origins: "*"
allowed-methods: GET, PUT, POST, DELETE, OPTIONS
allowed-headers: "*"
exposed-headers:
allow-credentials: true
max-age: 1800
这应该使 REST 调用成为可能。
我想我也需要启用此功能,但我不确定:
security:
basic:
enabled: true
我希望我可以调用这样的电话:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
....
Client client = Client.create();
client.addFilter(new HTTPBasicAuthFilter("admin", "admin"));
WebResource webResource = client.resource("http://localhost:8080/api/example");
但是我收到了 401。那我是不是错过了什么?
这里是我的 .yo-rc.json 文件:
{
"generator-jhipster": {
"jhipsterVersion": "3.0.0",
"baseName": "tinybotsWeb",
"packageName": "nl.tinybots.web",
"packageFolder": "nl/tinybots/web",
"serverPort": "8080",
"authenticationType": "session",
"hibernateCache": "ehcache",
"clusteredHttpSession": "no",
"websocket": "no",
"databaseType": "sql",
"devDatabaseType": "mysql",
"prodDatabaseType": "mysql",
"searchEngine": "elasticsearch",
"buildTool": "maven",
"enableSocialSignIn": true,
"rememberMeKey": "6799bca03613c99e29cd3c1bb7ac878157250d87",
"useSass": false,
"applicationType": "monolith",
"testFrameworks": [
"gatling",
"cucumber",
"protractor"
],
"enableTranslation": true,
"nativeLanguage": "nl",
"languages": [
"nl",
"en",
"de"
]
}
}
我将以下内容添加到 SecuryConfiguration:
http
.csrf()
.ignoringAntMatchers("/basicAuthApi/**")
...
.and()
.authorizeRequests()
.antMatchers("/basicAuthApi/**")
.hasAuthority(AuthoritiesConstants.BASIC_AUTH).and().httpBasic()
...
现在我可以提出请求了。
我现在的问题是: 我应该怎么做? 这安全吗? 这是在做什么?:
security:
basic:
enabled: true
最佳答案
这里总结了我如何在我的案例中实现该解决方案,我认为这是相似的。这是真正的 swift 代码,但请将其视为伪代码,因为它可能不正确。请注意,这是此处发布的解决方案的副本:Jhipster + REST client + authentication
调用您需要调用的任何方法,并在该方法中传递成功时的回调( block 或等效内容)和失败时的回调( block 或等效项)
func action( URLString:String, method:Method, encoding:Encoding = .JSON, parameters:[String : AnyObject]?, success:(statusCode:Int, responseObject:AnyObject)->Void, failure:(statusCode:Int, error:NSError)->Void )
在方法 es 内。
/events
您处理特定的失败情况,即状态代码为 401 时。if(r!.statusCode==ResponseCodes.HTTP_UNAUTHORIZED.rawValue){ loginAndAction(URLString, method: method, encoding: encoding, parameters: parameters, success: success, failure: failure) }else{ failure(statusCode: response.response!.statusCode, error:response.result.error!) }
在这种特殊情况下,您不是返回结果并调用失败回调,而是调用一个 login() 方法,该方法在必要的参数之后接受原始的
success()
回调func loginAndAction( URLString:String, method:Method, encoding: Encoding, parameters:[String:AnyObject]?, success:(statusCode:Int, responseObject:AnyObject)->Void, failure:(statusCode:Int, error:NSError)->Void )->Void
如果身份验证成功
var d:[String:AnyObject] = response.result.value as! [String:AnyObject] self.authToken = d["access_token"] as! String action(URLString, method: method,encoding:encoding, parameters: parameters, success: success, failure: failure)
此时,方法操作可以使用正确的工作 token 。
这应该每天只发生一次(基于 token 过期时间),并且它是适用于 oauth2 refresh_token
调用的机制。
关于java - 用java制作Jhipster REST客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37798996/