ServerAuthModule这里不细说,可以自行百度。

重点在注释:

 <!-- 声明用于安全约束的角色 -->
<security-role>
<role-name>spx.main</role-name>
</security-role>
<security-role>
<role-name>spx.user</role-name>
</security-role> <security-constraint>
<web-resource-collection>
<!-- 这个名字是必须的,自定义,由工具使用,别的地方不使用 -->
<web-resource-name>all</web-resource-name>
<!-- 指定要受约束的资源,至少有一个。可以有多个. -->
<url-pattern>/*</url-pattern>
<!-- 指定受约束的方法
如果没有<http-method>元素,所有http方法都受到约束。
这里放置了POST方法,表示只有POST方法是受约束的。其他任何角色的人可以访问GET和其他的方法。
但不能访问POST方法,除非通过下面<auth-constraint>的验证。
-->
<http-method>POST</http-method>
</web-resource-collection>
<!-- auth-constraint为可选 -->
<!-- 如果没有<auth-constraint>表示所有角色都能访问POST方法,如果是<auth-constraint/>表示任何角色都不能访问POST方法 -->
<auth-constraint>
<!-- 可选。表示哪些角色能够在指定的资源上调用受约束的方法。这里表示只有拥有spx.user角色的人能够访问POST方法
角色与上面<security-role>里的<role-name>对应 -->
<role-name>spx.user</role-name>
</auth-constraint>
</security-constraint>

在项目中导入sam模块的jar包,将项目打成war包,放入JavaEE容器中,启动服务,如此就实现了一次URL级别的权限控制。

假设通过以上验证进入到了VerifyAuthModuleServlet的doPost方法中,

可以在doPost中加上以下

UserInfo userInfo = (UserInfo)req.getUserPrincipal();

来获取到用户信息。

还可以加上以下来判断用户是否拥有其他角色:

 if(req.isUserInRole("spx.admin")) {
res.setStatus(200);
res.getWriter().print(hello);
return;
}

注意:"spx.admin"必须是web-app划分出来的角色中的一种,否则这里一直false。这里和@RolesAllowed("spx.main")有所区别,@RolesAllowed("spx.main")只需用户有该权限即可,

而没必要一定要存在于<security-role>中。

EJB中进行方法级别的权限判断

如以下无状态会话bean

@Stateless
public class HelloWorldBean implements HelloWorldLocal { private Logger logger = Logger.getLogger(HelloWorldBean.class.getName()); @EJB //采用注解方式
private Other other; @Resource
private SessionContext sessionContext; @RolesAllowed("spx.user")
public String sayHello(String name) { Principal principal = sessionContext.getCallerPrincipal();
logger.info("==========EJB============="+principal.getName()); return name+"说:你好世界!"+other.sayMe();
} }

@RolesAllowed判断请求的用户是否拥有此权限,如果拥有权限则可以进入方法体,不拥有则抛出EJBAccessException异常

 try{
hello = helloWorldLocal.sayHello("jiangmeng");
}catch (EJBAccessException e){
res.setStatus(403);
res.getWriter().write("{\"err\":\"403 forbidden\"}");
}

我们可以通过捕获该异常,给客户端相应的提示。

而且我们注意到上面可以在EJB中通过SessionContext.getCallerPrincipal()来获取到用户信息。

使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制的更多相关文章

  1. 基于.net mvc的校友录(五、web.config对的配置以及filter实现的权限控制)

    web.config配置文件 此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文 ...

  2. Spring中,applicationContext.xml 配置文件在web.xml中的配置详解

    一.首先写一下代码结构. 二.再看web.xml中的配置情况. <?xml version="1.0" encoding="UTF-8"?> < ...

  3. SpringMVC(十六):如何使用编程方式替代/WEB-INF/web.xml中的配置信息

    在构建springmvc+mybatis项目时,更常用的方式是采用web.xml来配置,而且一般情况下会在web.xml中使用ContextLoaderListener加载applicationCon ...

  4. javaWeb项目中Web.xml的基本配置

    这个地址写的非常好 ,欢迎大家访问 Å:http://www.cnblogs.com/hxsyl/p/3435412.html 一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感 ...

  5. 使用Spring时web.xml中的配置

    使用Spring时web.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <web-app x ...

  6. web.xml 通过contextConfigLocation配置spring 的方式

    部署到tomcat后,src目录下的配置文件会和class文件一样,自动copy到应用的 classes目录下 spring的 配置文件在启动时,加载的是web-info目录下的application ...

  7. web.xml常用元素配置

    tomcat服务器: tomcat是一个WEB服务器,所有的j2ee WEB程序可以在此处运行. tomcat服务器是一个符合j2ee标准的WEB服务器.则J2ee的EJB程序无法在此处运行. 如果要 ...

  8. J2EE进阶(五)Spring在web.xml中的配置

     J2EE进阶(五)Spring在web.xml中的配置 前言 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制自动加载到容器中.在web ...

  9. Struts在Web.xml中的配置及Struts1和Struts2的区别

    (1)配置Struts的ActionServlet     <servlet>元素来声明ActionServlet    <servlet-name>元素:用来定义Servle ...

随机推荐

  1. php错误的处理

    错误的分类 通常分3种: 语法错误: 程序运行之前,都要先检查语法.如果语法有错误,就会立即报错,并且不会去执行程序. 运行时错误: 就是在程序语法检查通过后,,开始运行程序并在此过程中遇到的错误.常 ...

  2. python的tkinter版本不匹配问题:RuntimeError: test:tk.h version (8.4) doesn't match libtk.a version (8.5)

    Traceback (most recent call last): File "/root/CodeWorkPace/test/TCPClient.py", line 20, i ...

  3. 2017-3-22 HTML 表单 、框架

    表单:<form action="" method="get/post" ></form> 表单元素:12个 1.文本类 文本框:< ...

  4. Java集合总结系列2:Collection接口

    Collection 接口是 Java 集合类的一个根接口,Java 在 Collection 接口中定义了许多通用的数据操作类方法以及判断类方法. 通过查看 API 文档或源码的方式,我们可以了解到 ...

  5. 使用U盘安装ubuntu 12.04(使用大白菜u盘启动工具)

    家里有个u盘启动盘,用大白菜U盘工具做的. 1.把iso文件放到u盘里,把ISO文件中的casper目录下的vmlinuz和initrd拷贝到u盘根目录下: 2.修改启动顺序,选u盘启动: 3.启动时 ...

  6. hive的安装和升级

    目录 [toc] 安装 升级 安装 nohup hive –service hiveserver & 启动: sudo nohup ./hive --service metastore &am ...

  7. 深度学习的2016: NIPS 2016速览

    With best wishes for a happy New Year! NIPS(Nerual Information Processing Systems)是人工智能.机器学习领域的顶级学术会 ...

  8. 【Scala】Scala之Packaging and Imports

    一.前言 前面介绍了Scala的Object,由于中间论文的时间耽误了些时间,接着继续学习Scala的Packaging和Imports 二.Packaging and Imports Scala的包 ...

  9. Ackerman 函数 (双递归函数)

    public static int ackerman(int n,int m){  if(n==1&&m==0){return 2;}  else if(n==0&&m ...

  10. c++标准库容器【转】

    C++最原始的容器之一是数组.数组的特点有: 1.大小固定 2.单独存在的数组建立在栈上,作为对象成员存在的数组建立在堆上还是栈上则要看作为宿主对象是被建立在堆上还是栈上.栈空间是有限的,所以如果数组 ...