我一直在尝试在客户端代码中实现角色基本授权,以限制特定用户的视图。
我正在尝试使用以下代码来限制视图
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
我也在尝试添加以下代码
Authentication a = SecurityContextHolder.getContext().getAuthentication();
UserDetails currentUserDetails = (UserDetails) a.getPrincipal();
然后在module.gwt.xml文件中添加以下内容
<inherits name='org.springframework.security.core.Authentication' />
<inherits name='org.springframework.security.core.context.SecurityContextHolder' />
<inherits name='org.springframework.security.core.userdetails.UserDetails' />
但是在编译时会出现以下错误
[ERROR] Unable to find 'org/springframework/security/core/Authentication.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source?
[java][ERROR] Line 22: Unexpected exception while processing element 'inherits'
请建议我哪里出错了,我该怎么做才能使这项工作。
答案 0 :(得分:0)
简短的回答是:不可能。
在客户端,只有a specific subset of Java is emulated,并且您使用的所有库都必须专门用于GWT(包括拥有自己的.gwt.xml)。
当您尝试在客户端使用Spring类时,GWT将不会知道它们并抛出错误,如果您尝试导入模块,它将查找相应的.gwt.xml文件(显然不会因为Spring项目不适用于GWT而存在。
那么,你能做什么?
保护所有RPC调用服务器端:如果用户可以加载视图,则无法加载数据。
为未经过身份验证的用户保护.html页面(您必须为登录创建不同的页面)。这将阻止将应用程序访问未记录的用户。您还可以查看其他一些想法here,包括servlets / jsp。
每次用户请求视图检查他是否经过身份验证/是否拥有权限时,都要进行RPC调用。最好在客户端缓存此信息以避免减慢应用程序速度(在用户注销时不要忘记清理缓存)。