@PreAuthorize不适用于从另一个函数调用的函数

时间:2016-08-30 11:50:32

标签: java spring-security

我想了解春天的安全。我使用的是java-config而不是xml。我尝试创建一个控制器,然后测试df.loc[df.Col2.isin(['Z','X']), 'Col3'] = 'J' df.loc[df.Col2 == 'Y', 'Col3'] = 'K' df['Col3'] = df.Col3.fillna(df.Col1) print (df) Col1 Col2 Col3 1 A Z J 2 B Z J 3 B X J 4 C Y K 5 C W C 符号。但是在我给定的代码中,@PreAuthorize仅在我使用@PreAuthorize函数时才有效,但当我使用getActiveSessions函数时它没有效果。所以这段代码按预期工作

getName

但这不是

public class DemoSessionController extends SessionController{

        @RequestMapping("/welcome/{a}")
        @PreAuthorize("hasRole('ROLE_ADMIN')")
        public String getActiveSessions(@PathVariable String a) {
            // TODO Auto-generated method stub
            String str = getName(a);
            return str;
        }

        public String getName(String name) {
            // TODO Auto-generated method stub
            return "This is "+name+"";
        }
    }

有人可以解释为什么第二种情况不起作用,我该如何才能使其发挥作用?谢谢!!

1 个答案:

答案 0 :(得分:1)

如评论中所述,仅在从外部调用对象时才会处理注释。有几种解决方案。

您可以将需要注释的方法拆分为在单独的对象中处理,例如一个用

注释的AdminObject
template <typename U,
    typename T = std::enable_if_t<std::is_pointer<U>::value, std::remove_pointer_t<U>>>
void f(U const& pof)  // U == T*

在班级。这样您就不需要为每种方法添加注释。您应该在类private中标记内部方法,以防止从外部使用它们。这需要重新排序应用程序逻辑,但将所有管理任务放在一个对象中可能会有所帮助。

另一个解决方案显然是为方法所做的所有任务添加所需的注释,包括由公共方法使用的方法执行的注释。

编辑1:

添加了示例类以使建议的解决方案更加清晰

@PreAuthorize("hasRole('ROLE_ADMIN')")