OAuth2 JWT配置文件引入了将JWT用作授权授权和客户端身份验证的可能性.
JWT客户端身份验证功能独立于某种授权类型,可以与任何授权类型一起使用,也可以与客户端凭据授予一起使用.
但是,使用JWT授权类型似乎与使用JWT客户端身份验证的客户端凭据授权完全相同,只是语法略有不同.
在这两种情况下,客户端都会联系令牌端点以获取访问令牌:
POST /token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=[JWT]
Run Code Online (Sandbox Code Playgroud)
VS
POST /token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=[JWT]
Run Code Online (Sandbox Code Playgroud) 当QTcpSocket
用于接收数据时,使用的readyRead()
信号表示新数据可用.但是,当您在相应的插槽实现中读取数据时,不会readyRead()
发出其他内容.这可能是有意义的,因为您已经在函数中,您正在读取所有可用的数据.
但是假设此插槽的以下实现:
void readSocketData()
{
datacounter += socket->readAll().length();
qDebug() << datacounter;
}
Run Code Online (Sandbox Code Playgroud)
如果一些数据在通话后readAll()
但在离开插槽之前到达怎么办?如果这是另一个应用程序发送的最后一个数据包(或者至少是最后一个数据包),该怎么办?不会发出额外的信号,因此您必须确保自己读取所有数据.
当然我们可以像这样修改插槽:
void readSocketData()
{
while(socket->bytesAvailable())
datacounter += socket->readAll().length();
qDebug() << datacounter;
}
Run Code Online (Sandbox Code Playgroud)
但是,我们还没有解决问题.数据仍然可能在socket->bytesAvailable()
-check 之后到达(甚至在函数的绝对末尾放置/另一个检查也无法解决此问题).
由于这个问题当然很少发生,我坚持第一个插槽的实现,我甚至会添加一个人工超时,以确保出现问题:
void readSocketData()
{
datacounter += socket->readAll().length();
qDebug() << datacounter;
// wait, to make sure that some data arrived
QEventLoop loop;
QTimer::singleShot(1000, &loop, SLOT(quit()));
loop.exec();
}
Run Code Online (Sandbox Code Playgroud)
然后我让另一个应用程序发送100,000字节的数据.这是发生的事情:
新的联系!
32768(或16K或48K)
读取消息的第一部分,但不再读取结尾,因为readyRead()
不会再次调用.
我的问题是:什么是最好的方法来确定,这个问题永远不会发生?
我提出的一个解决方案是再次在末尾再次调用相同的插槽,并在插槽的开头检查是否还有更多数据要读取:
void readSocketData(bool selfCall) // default …
Run Code Online (Sandbox Code Playgroud) 我想在C++中定义一个新类型,它只是一些原始类型(在我的例子中int
,可以是任何类型).我NodeId
在这个例子中调用了这个类型.
我可以用typedef int NodeId
.我想要一个NodeId
s 的默认值,所以我会用#define NULL_NODE_ID -1
.
现在,我认为定义一个类而不是typedef
允许一个函数isValid()
和构造一个null的默认构造函数会更好NodeId
:
class NodeId
{
int value;
public:
inline NodeId() : value(-1) {}
inline NodeId(int value) : value(value) {}
inline operator int() {return value;}
inline bool isValid() {return value != -1;}
//...
};
Run Code Online (Sandbox Code Playgroud)
是否存在导致使用第二种方法的性能缺点?
我开始在Qt中编写一个非常基本的文本操作应用程序,没有GUI.我的文字包含特殊字符,但无论如何,无论我做什么,我都无法打印出那些特殊字符.然后我注意到,在添加一个QCoreApplication
实例(我之前删除过,因为我认为我不需要它)之后,一切都正常工作.
这是代码:
#include <QCoreApplication>
#include <QString>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString s(QString::fromUtf8("aä\xc3\xa4")); // aää
qDebug() << s;
qDebug() << s.toAscii();
qDebug() << s.toLatin1();
qDebug() << s.toUtf8();
qDebug() << s.toLocal8Bit();
qDebug("%s", qPrintable(s));
qDebug("%i", s.length());
qDebug("%i", strlen(qPrintable(s)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出QCoreApplication
(一切正常):
"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5
Run Code Online (Sandbox Code Playgroud)
注释掉行后的输出,在哪里QCoreApplication
定义(不再显示特殊字符):
"a"
"a"
"a"
"a"
"a"
a
3
1
Run Code Online (Sandbox Code Playgroud)
请注意,在调用之后qPrintabable(s)
,特殊字符已被删除.我测试了这个以确定,这QDebug
不是问题.
我还检查了文件是否真的用UTF-8编码.
为什么QString没有正确处理特殊字符,当没有QCoreApplication
实例化时?
我试图在本教程后面的glassfish 3.1中配置一个简单的文件域:
我做了一切,因为它说但不起作用,当我前往管理页面时,我没有看到弹出消息要求凭据.这就是我做的:
1-创建文件域:
2-然后我使用manage users按钮创建了一个用户
3-I使用图形界面而不是编辑器创建了glassfish-web.xml文件
4 - 然后以同样的方式配置web.xml
对不起,如果最后一张图片有点难以看清,你可以放大.
当我使用URL前往/admin.xhtml时,没有什么能阻止我查看页面内容,这意味着没有正确配置.我不知道我错过了什么.有人可以试着找出我不能让这个简单的安全任务工作的原因吗?
更新
这是我的web.xml源码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>Constraint1</display-name>
<web-resource-collection>
<web-resource-name>allowed</web-resource-name>
<description/>
<url-pattern>/admin.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>administrator</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
<security-role>
<description/>
<role-name>administrator</role-name>
</security-role>
</web-app>
Run Code Online (Sandbox Code Playgroud)
还有glassfish-web.xml源码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server …
Run Code Online (Sandbox Code Playgroud) 我有以下问题(在我的版本中有一些约束可能使问题更容易解决,但一般的解决方案也会很好):
我有4个列表,有10个条目.第一个列表包含0到6之间的整数条目,其他三个包含0到3之间的条目.我现在必须找到这四个列表的100个最佳元素组合.一个组合由4个值的总和组成,每个列表中有一个值.请注意,我不仅需要知道结果元素的值,还需要知道它们的组成方式,因为有更多与值相关的信息.
例1:
list A: 6, 3, 2, 2, 1, 0, 0, 0, 0
list B: 3, 2, 0, 0, 0, 0, 0, 0, 0
list C: 2, 2, 0, 0, 0, 0, 0, 0, 0
list D: 3, 1, 1, 1, 1, 1, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,五种最佳组合是:
我正在尝试编写自己的ServerAuthModule
,使用自定义登录系统.
如果我理解了一切正确,那么容器会为每个传入的请求调用validateRequest方法,并且我的SAM将检查凭据,并告诉容器用户的用户名和组(如果凭据是正确的)通过的CallbackHandler.
public class MySAM implements ServerAuthModule {
@Override
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
// check user credentials
...
// set username and groups
CallerPrincipalCallback cpCallback = new CallerPrincipalCallback(clientSubject, username);
GroupPrincipalCallback gpCallback = new GroupPrincipalCallback(clientSubject, groups);
callbackHandler.handle(new Callback[]{cpCallback, gpCallback}
return AuthStatus.SUCCESS;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,当用户登录时,我不知道用户属于哪些组.我只能检查用户是否在给定的组中.是否有可能为容器提供一种方法,使用该方法可以检查用户是否在给定组中,而不是在validateRequest
方法中为其提供包含组的数组?
boolean isInGroup(String username, String group) {
// ask backend system
}
Run Code Online (Sandbox Code Playgroud) 所以我正在编写一段代码,我必须在上面的iOS 4.3中使用Accelerometer和陀螺仪检测不同的移动手势.
Q1:是否有任何已实现任何移动/手势检测的开源代码?
如果不
Q2:现在我想检测一下iPhone是否掉线了.
到目前为止我所取得的成就: CoreMotion API提供了userAcceleration,其中(afaik)是用户给予设备的加速度或设备在某个方向(x,y或z)的加速度,而不考虑重力因此我是什么可以做的是:存储,比方说,前面的5-6个加速度参数值,可以检查其中任何一个点击大的负值,这基本上代表突然减速.
但是这个解决方案并不是非常优化,我认为我需要先以某种方式检测设备的自由落体/向下运动.知道如何解决这个问题吗?
更新: 感谢Misch分享您的方法.我一点也不考虑总加速度.我完全按照你的说法做了:
"但是你必须自己测试一下,"你的情况下"总加速度大致相当于地球加速度"和"一段时间".
加速度值实际上是G',因此我测试了"总加速度"值,范围为0.9 - 1.1.我检查了一段时间,最初我在updateInterval设置为1/20.0时检查了四个连续的值.现在我已经放松了一点连续的条件.
这是一个示例输出:
加速度= 0.090868
加速度= 0.074473
加速度= 0.159797
加速度= 1.157513
加速度= 1.224588
加速度= 1.036272
加速度= 0.914698
加速度= 0.904093
加速度= 0.941516
加速度= 0.046362
加速度= 0.045109
加速度= 0.060045
我想,我仍然要继续测试和调整价值观.如果你有任何优化,请分享,我知道为了帮助你需要看到许多自由落体加速度值的样本.现在我想: