Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SpringSecurity3中设置用户角色?_Spring_Authentication_Spring Security_Roles_Spring Webflow 2 - Fatal编程技术网

如何在SpringSecurity3中设置用户角色?

如何在SpringSecurity3中设置用户角色?,spring,authentication,spring-security,roles,spring-webflow-2,Spring,Authentication,Spring Security,Roles,Spring Webflow 2,我正在研究JavaEE技术来学习JSF SpringHibernate与。。。 我正在尝试使用不同的用户角色来执行web应用程序。现在,我只有一个用户角色role\u user。我不能改变这个角色。我试着去理解我们是如何设置这个角色的,但是我不知道它发生在哪里 所以,我的主要问题是我不能在我的应用程序中创建任何其他角色。如果我不在我的流中使用(我使用的是SpringWebFlow),那么每个人都可以访问该页面。如果我只做角色用户。但是我想创建一个名为role_ADMIN的新角色,并且只允许rol

我正在研究JavaEE技术来学习JSF SpringHibernate与。。。 我正在尝试使用不同的用户角色来执行web应用程序。现在,我只有一个用户角色role\u user。我不能改变这个角色。我试着去理解我们是如何设置这个角色的,但是我不知道它发生在哪里

所以,我的主要问题是我不能在我的应用程序中创建任何其他角色。如果我不在我的流中使用
(我使用的是SpringWebFlow),那么每个人都可以访问该页面。如果我只做角色用户。但是我想创建一个名为role_ADMIN的新角色,并且只允许role_ADMIN访问该页面

注意:我没有在这里添加所有文件,因为我只添加了相关的类和文件。如果你需要更多的信息,请告诉我

这是我遵循的教程soruce代码。

security-config.xml

<?xml version="1.0" encoding="UTF-8"?>
我发现这个函数,im我的服务类,是在processUserAuthentication中调用的。然后我认为这就是角色设置的函数

public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException {

    Users user = userDao.loadUserByUserName(userName);

    if (user == null) {
        throw new UsernameNotFoundException(String.format(
                getMessageBundle().getString("badCredentials"), userName));
    }

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority("USER_ROLE"));
    User userDetails = new User(user.getUserName(), user.getPassword(),
            authorities);
    return userDetails;
}
public UserDetails loadUserByUsername(字符串用户名)
抛出UsernameNotFoundException{
Users user=userDao.loadUserByUserName(用户名);
if(user==null){
抛出新的UsernameNotFoundException(String.format(
getMessageBundle().getString(“badCredentials”),用户名);
}
收集权限=新建ArrayList();
添加(新的SimpleGrantedAuthority(“用户角色”);
User userDetails=新用户(User.getUserName(),User.getPassword(),
当局);
返回用户详细信息;
}
更新:

在我的项目中,我必须使用这个语法来创建角色:ROLE_X,其中X是任意字符串。例子;我们可以使用ROLE\u MYNAME,但不能使用juts MYNAME或MYNAME\u ROLE作为角色。它必须从角色开始。我仍在努力寻找这个问题的根源。如果我找到任何答案,我会更新

编辑: 在本页中有一个详细的解释,说明为什么我们必须使用ROLE_uu;

现在,用户角色已在应用程序中硬编码。理想情况下,用户到角色的映射将来自数据库中的Authorities表。然后可以使用DB查询检索此映射信息,然后将其添加到Authority集合中

authorities.add(loadUserAuthorities(user.getUsername()));

protected List<GrantedAuthority> loadUserAuthorities(String username) {
    List<GrantedAuthority> authorities = null;
    Object[] params = { username };
    authorities = authoritiesByUsernameMapping.execute(params); // Query to get Authorities
    return authorities;      
}
authorities.add(loadUserAuthories(user.getUsername());
受保护列表LoadUserAuthories(字符串用户名){
列表权限=空;
对象[]参数={username};
authorities=authoritiesByUsernameMapping.execute(params);//查询以获取权限
返回当局;
}

权限。添加(新的SimpleGrantedAuthority(“用户角色”)我认为这是我们将用户权限设置为硬代码的一行,对吗?因此,如果我编写
authority.add(新的SimpleGrantedAuthority(“ROLE_X”)然后更改安全标签,如
我应该可以工作,对吗?但事实并非如此。我读了一些关于从数据库中获取角色的文章,但首先我想确定它是否有效。请让我知道,如果我误解了。无论你刚刚发布什么应该工作,硬编码的权力,以角色_管理员。您能否为org.springframework.security启用调试,并检查您尝试访问的url的日志内容。我将log4j.category.org.springframework.security=debug添加到我的log4j文件中,然后我得到了此日志。()我从控制台复制了此日志,但它显示了其中的一部分。stackoverflow不让我放在这里,所以我粘贴到了粘贴箱。这是我的log4j文件:@user1921974你在用userid吗?从日志中可以看出,用户正在获得role-TEST\u角色。SecurityContext存储到HttpSession:org.springframework.security.authentication。UsernamePasswordAuthenticationToken@9e7d34a3:Principal:org.springframework.security.core.userdetails。User@1cb64:用户名:wer;密码:[受保护];启用:真;AccountNoExpired:正确;无需证明的凭证:真实;AccountNonLocked:true;授予的权限:测试单元角色;凭据:[受保护];认证:正确;详细信息:空;授权权限:TEST_ROLE‘我不明白你说userid wer是什么意思?但是,我发现了问题。我们需要使用这种语法来创建角色。语法是ROLE_X,其中X是任意字符串。我写的,但我做错了(可怜的我,对不起)。我们可以使用角色测试,但不能使用测试角色或测试角色。我不知道为什么我们必须使用角色,但它是这样工作的。我的搜索仍将找到真正的原因;)
public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException {

    Users user = userDao.loadUserByUserName(userName);

    if (user == null) {
        throw new UsernameNotFoundException(String.format(
                getMessageBundle().getString("badCredentials"), userName));
    }

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority("USER_ROLE"));
    User userDetails = new User(user.getUserName(), user.getPassword(),
            authorities);
    return userDetails;
}
authorities.add(loadUserAuthorities(user.getUsername()));

protected List<GrantedAuthority> loadUserAuthorities(String username) {
    List<GrantedAuthority> authorities = null;
    Object[] params = { username };
    authorities = authoritiesByUsernameMapping.execute(params); // Query to get Authorities
    return authorities;      
}