尝试使用 JSR-179 时引发 SecurityException
Posted
技术标签:
【中文标题】尝试使用 JSR-179 时引发 SecurityException【英文标题】:SecurityException is raised when trying to use JSR-179 【发布时间】:2012-05-25 08:58:58 【问题描述】:我想通过这个代码得到手机的longitude
和latitude
:
public void commandAction(Command com, Displayable d)
if (com == position)
try
Criteria cr = new Criteria();
cr.setHorizontalAccuracy(500);
LocationProvider lp = LocationProvider.getInstance(cr);
// get the location, one minute timeout
Location l = lp.getLocation(60);
Coordinates coords = l.getQualifiedCoordinates();
if (coords != null)
double longitude = coords.getLongitude();
double latitude = coords.getLatitude();
String sLong = String.valueOf(longitude);
String sLat = String.valueOf(latitude);
Tlongitude.setString(sLong);
Tlatitude.setString(sLat);
catch (LocationException ex)
Tlongitude.setString("LocationException");
Tlatitude.setString("LocationException");
catch (InterruptedException ex)
Tlongitude.setString("InterruptedException");
Tlatitude.setString("InterruptedException");
问题是当单击“位置”命令时,系统会显示一条警报:java.lang.SecurityException : Application not authorized to access the restricted API
。
那我该怎么办?
【问题讨论】:
【参考方案1】:将相关权限添加到您的应用程序中,并使用相应安全域中的证书对其进行签名。
JSR179 规范在javax.microedition.location
下定义了 7 个权限。根据您需要代码执行的操作来选择您需要的那些。
如果位置功能组位于您要运行代码的手机的受信任第三方安全域中,Lucifer 的解决方案(Verisign 或 Thawte)将有所帮助。不过,手机的移动网络运营商或制造商可能已决定将位置信息放在他们的安全域中。
https://***.com/q/1716755 包含对 MIDP 安全模型的简要说明。
【讨论】:
您的链接答案描述了,如何阻止来自模拟器的这些消息,但您在真实设备中不会做同样的事情 不幸的是,java-me 开发人员通常无法访问真实设备的安全策略。您所希望的只是制造商或移动网络运营商提供的一些文档,告诉您功能组属于哪个安全域(诺基亚文档足够好)。但是,通常情况下,第三方开发人员不得不通过反复试验来解决问题。 同意,但最终的解决方案是仅签署证书。【参考方案2】:您正在尝试访问位置 API,这是一个受限 API。为此,您必须使用 Verisign、Thawte 等签名证书对您的移动应用程序进行签名。
证书的费用约为 20K 印度卢比。
您可以访问我关于签名证书的其他答案 here 和 here。
【讨论】:
以上是关于尝试使用 JSR-179 时引发 SecurityException的主要内容,如果未能解决你的问题,请参考以下文章
使用 @Security 时引发的异常为 RuntimeException
即使凭据为真,Spring Boot Security 也会在 API 调用上引发 401 身份验证错误
如果 JSF 页面受 j_security_check 保护,则不会在 ajax 请求上引发 ViewExpiredException
部分受信任的 AppDomain 中的代码在相对路径解析中引发 System.Security.Permissions.FileIOPermission