请教Spring mvc,权限,路径 的问题

Macrotea 发布于 2011/09/24 19:23
阅读 3K+
收藏 0
1.需求
前台展示文章列表
www.mydomain.com/article/list.do

对于后台文章的管理,需要管理员登陆后才能操作,后台管理文章列表
www.mydomain.com/admin/article/list.do

2.不解

关于文章的操作,都是在UserTypeController中
@Controller
@RequestMapping("/article")
public class ArticleController


但是它只是对应着一个路径映射:"/article"
然而对于文章这一块的控制(现在看到的是文章列表),却有两个路径:
/article/list.do(前台)
/admin/article/list.do(后台)

3.请教
这个问题应该如何处理,请有经验的指导我一下,或许我人在庐山中。谢谢
加载中
0
︶ㄣ荖莮孩ㄜ︵
︶ㄣ荖莮孩ㄜ︵

    没看懂你的意思!就我理解你的问题,我简单的说下解决方法。

    关于这个问题 :   

     然而对于文章这一块的控制(现在看到的是文章列表),却有两个路径: 

     /article/list.do(前台) 

     /admin/article/list.do(后台)

     你的意思是,有两个文章列表页请求,一个是网站的,一个是信息管理系统的?如果是这样的话,那么对于你的这种配置 

        @Controller 

        @RequestMapping("/article") 
        public class ArticleController

        

        只能映射到  /article/list.do(前台) 这个请求,比如你的 ArticleController 中肯定会有个如下的方法,并且对应的映射为@RequestMapping("/list.do") 


        @RequestMapping("/list.do") 

        public String articleList(){ 

            // write code here 

        }

             

        至于这个请求 /admin/article/list.do(后台) ,肯定是映射不到的!实现这个需求,两种解决办法!

        1.你在该ArticleController 控制器中加入类似于上面的代码,并且请求路径上稍微修改一下,比如 /article/admin/list.do(后台),这个是合法的路径。因为你的控制器 ArticleController 上的映射注解为 @RequestMapping("/article")  ,也就是说 http://localhost:8080/yourWebapp/article  所有关于 article 的请求都可以映射到该控制器!

      2. 如果你一定要用这个路径 /admin/article/list.do(后台),那么就重新写一个控制器,比如 

     @Controller 

     @RequestMapping("/ admin ") 

     public class AdminArticleController


     同样的,该控制器中有一个类似如下的方法

      @RequestMapping("/ article/list.do ") 

      public String articleList(){ 

            // write code here 

      }

      这样,你就可以用这个/admin/article/list.do(后台)路径了。 

0
Macrotea
Macrotea

引用来自“︶ㄣ荖莮孩ㄜ︵”的答案

    没看懂你的意思!就我理解你的问题,我简单的说下解决方法。

    关于这个问题 :   

     然而对于文章这一块的控制(现在看到的是文章列表),却有两个路径: 

     /article/list.do(前台) 

     /admin/article/list.do(后台)

     你的意思是,有两个文章列表页请求,一个是网站的,一个是信息管理系统的?如果是这样的话,那么对于你的这种配置 

        @Controller 

        @RequestMapping("/article") 
        public class ArticleController

        

        只能映射到  /article/list.do(前台) 这个请求,比如你的 ArticleController 中肯定会有个如下的方法,并且对应的映射为@RequestMapping("/list.do") 


        @RequestMapping("/list.do") 

        public String articleList(){ 

            // write code here 

        }

             

        至于这个请求 /admin/article/list.do(后台) ,肯定是映射不到的!实现这个需求,两种解决办法!

        1.你在该ArticleController 控制器中加入类似于上面的代码,并且请求路径上稍微修改一下,比如 /article/admin/list.do(后台),这个是合法的路径。因为你的控制器 ArticleController 上的映射注解为 @RequestMapping("/article")  ,也就是说 http://localhost:8080/yourWebapp/article  所有关于 article 的请求都可以映射到该控制器!

      2. 如果你一定要用这个路径 /admin/article/list.do(后台),那么就重新写一个控制器,比如 

     @Controller 

     @RequestMapping("/ admin ") 

     public class AdminArticleController


     同样的,该控制器中有一个类似如下的方法

      @RequestMapping("/ article/list.do ") 

      public String articleList(){ 

            // write code here 

      }

      这样,你就可以用这个/admin/article/list.do(后台)路径了。 

十分感谢你的指导,让我有点眉目了

不过像你说的方案1的话:

那么controller将变成如下:

@Controller
@RequestMapping("/article")
public class ArticleController

//前台文章列表
@RequestMapping("/list.do ")
public String articleList(){

}

//后台文章列表
@RequestMapping("/admin/list.do ")
public String adminList(){

}

这种方案可行

但是我每次将要有个filter判断路径是否有admin来检查是否有session了 ?

 

 

0
︶ㄣ荖莮孩ㄜ︵
︶ㄣ荖莮孩ㄜ︵

     "但是我每次将要有个filter判断路径是否有admin来检查是否有session了 ?"   

      是这样的,因为只要是合法的路径,比如 http://localhost:8080/yourWebapp/article/admin/list.do 就可以请求到 

    //后台文章列表

    @RequestMapping("/admin/list.do ")
    public String adminList(){ 

    }

    这个方法中。
    然而正确的操作流程是,登录网站的后台管理系统,然后才能请求这个方法。

                

    首先得确定一点,你想怎么做?解决一个问题的方法可以有很多中,就看你采取哪种了。

    如果你想前后台共用一个控制器,当然也是可以的,也就是说合法的请求都可以请求到这个控制器中。下来就看你的需求是怎么样了,两种情况。1。比如前台文章列表只要访问网站就可以请求该方法,查看文章列表,也就是说这个方法没有任何的限制。2 前台的文章列表还是需要网站的用户登录后才能查看。  

    无论情况1 还是 情况 2,这个后台文章列表都是需要登录后台管理系统后才能查看的,所以这个方法是有限制的,甚至你的后台管理系统还区分很多角色,而这个文章列表的相关操作也只针对某部分角色的用户才开放,无论怎样,这个方法是需要保护起来的。

    那么,你就得在进入方法前做登录判断,或者进入方法时做判断(想想看,后台管理系统的每步操作都需要判断,那你每个方法岂不是都得写if else ,所以这种方式不推荐)。可是我们并不知道某个用户什么时候会请求到这个需要保护的方法,所以,每个来自客户端的请求都需要进行拦截,然后进行相关的逻辑处理,比如登录判断、session 超时判断、是否恶意攻击判断等...你的系统需要有个 filter 或者 interceptor 进行过滤或者拦截。你可以自己写个简单的过滤器,也可以用开源社区的一些开源的安全框架。还是那句话,看你的需要了。其实,你的这个 检查 session 的需求已经属于 安全部分需要做的工作了,不过再说下去,就超出你的主题讨论范围了。呵!因为安全这块蛮麻烦的,也是蛮有难度的。可以给你推荐一个非常棒的开源安全框架,你可能都知道,Spring Security ,今年的前8个月,我负责着我们系统的安全这块。有问题可以跟我交流。我的邮箱 linlun.happy@gmail.com


    

            

0
Macrotea
Macrotea

引用来自“︶ㄣ荖莮孩ㄜ︵”的答案

     "但是我每次将要有个filter判断路径是否有admin来检查是否有session了 ?"   

      是这样的,因为只要是合法的路径,比如 http://localhost:8080/yourWebapp/article/admin/list.do 就可以请求到 

    //后台文章列表

    @RequestMapping("/admin/list.do ")
    public String adminList(){ 

    }

    这个方法中。
    然而正确的操作流程是,登录网站的后台管理系统,然后才能请求这个方法。

                

    首先得确定一点,你想怎么做?解决一个问题的方法可以有很多中,就看你采取哪种了。

    如果你想前后台共用一个控制器,当然也是可以的,也就是说合法的请求都可以请求到这个控制器中。下来就看你的需求是怎么样了,两种情况。1。比如前台文章列表只要访问网站就可以请求该方法,查看文章列表,也就是说这个方法没有任何的限制。2 前台的文章列表还是需要网站的用户登录后才能查看。  

    无论情况1 还是 情况 2,这个后台文章列表都是需要登录后台管理系统后才能查看的,所以这个方法是有限制的,甚至你的后台管理系统还区分很多角色,而这个文章列表的相关操作也只针对某部分角色的用户才开放,无论怎样,这个方法是需要保护起来的。

    那么,你就得在进入方法前做登录判断,或者进入方法时做判断(想想看,后台管理系统的每步操作都需要判断,那你每个方法岂不是都得写if else ,所以这种方式不推荐)。可是我们并不知道某个用户什么时候会请求到这个需要保护的方法,所以,每个来自客户端的请求都需要进行拦截,然后进行相关的逻辑处理,比如登录判断、session 超时判断、是否恶意攻击判断等...你的系统需要有个 filter 或者 interceptor 进行过滤或者拦截。你可以自己写个简单的过滤器,也可以用开源社区的一些开源的安全框架。还是那句话,看你的需要了。其实,你的这个 检查 session 的需求已经属于 安全部分需要做的工作了,不过再说下去,就超出你的主题讨论范围了。呵!因为安全这块蛮麻烦的,也是蛮有难度的。可以给你推荐一个非常棒的开源安全框架,你可能都知道,Spring Security ,今年的前8个月,我负责着我们系统的安全这块。有问题可以跟我交流。我的邮箱 linlun.happy@gmail.com


    

            

为什么对我那么好,那么热情,让我很感动
0
飞扬的梦
飞扬的梦
拦截权限的时候,不是根据当前请求字符串进行拦截的,事实上,在我看到,菜单或者说按钮什么的,不应该属于授权信息,而是应该有用户-角色-权限,然后用权限绑定菜单权限,粒度控制到操作级别即可满足一切权限要求,可以参考RBAC新解。
返回顶部
顶部