Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
Java Spring安全性:如何向经过身份验证的用户添加额外角色_Java_Security_Spring Security - Fatal编程技术网

Java Spring安全性:如何向经过身份验证的用户添加额外角色

Java Spring安全性:如何向经过身份验证的用户添加额外角色,java,security,spring-security,Java,Security,Spring Security,我有一个使用REST服务和spring安全性的应用程序。我有基本的身份验证,我需要有硬和软登录 场景是:当用户登录时,他被分配角色\u SOFT 并且可以访问需要ROLE_SOFT的URL,但是如果他想访问需要ROLE_HARD的URL,他必须向指定的web服务发送一些代码或东西 所以我读了这个 之后,我创建了我的: public class AuthenticationWrapper implements Authentication { private Authentication

我有一个使用REST服务和spring安全性的应用程序。我有基本的身份验证,我需要有硬和软登录

场景是:当用户登录时,他被分配角色\u SOFT 并且可以访问需要ROLE_SOFT的URL,但是如果他想访问需要ROLE_HARD的URL,他必须向指定的web服务发送一些代码或东西

所以我读了这个

之后,我创建了我的:

public class AuthenticationWrapper implements Authentication
{
   private Authentication original;

   public AuthenticationWrapper(Authentication original)
   {
      this.original = original;
   }


   public String getName() { return original.getName(); }
   public Object getCredentials() { return original.getCredentials(); }
   public Object getDetails() { return original.getDetails(); }   
   public Object getPrincipal() { return original.getPrincipal(); }
   public boolean isAuthenticated() { return original.isAuthenticated(); }
   public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
   {
      original.setAuthenticated( isAuthenticated );
   }

public Collection<? extends GrantedAuthority> getAuthorities() {
    System.out.println("EXISTING ROLES:");
    System.out.println("Size=:"+original.getAuthorities().size());
    for (GrantedAuthority iterable : original.getAuthorities()) {

        System.out.println(iterable.getAuthority());
    }

    GrantedAuthority newrole = new SimpleGrantedAuthority("ROLE_HARD");
    System.out.println("ADD new ROLE:"+newrole.getAuthority());
    Collection<? extends GrantedAuthority> originalRoles = original.getAuthorities();

     ArrayList<GrantedAuthority> temp = new ArrayList<GrantedAuthority>(originalRoles.size()+1);
     temp.addAll(originalRoles);
     temp.add(newrole); 
     System.out.println("RETURN NEW LIST SIZE"+temp.size());
     for (GrantedAuthority grantedAuthority : temp) {
        System.out.println("NEW ROLES:"+grantedAuthority.getAuthority());
    }

    return Collections.unmodifiableList(temp);
}
但在我更改身份验证后,我的会话将停止。。
也许有人知道更好的解决办法

只是个主意。。如果用户第一次使用登录表单登录,并且需要访问需要额外权限的资源,那么为什么不再次将用户重定向回登录页面

    <http auto-config="true" use-expressions="true">
                <intercept-url pattern="/resources/**" access="denyAll"/>
                <intercept-url pattern="/login.do" access="permitAll"/>
                <intercept-url pattern="/role_soft_url_domain/* " access="hasRole('ROLE_SOFT') and fullyAuthenticated"/>
                <intercept-url pattern="/role_hard_url_domain/*" access="hasRole('ROLE_HARD') and fullyAuthenticated"/>             
                <intercept-url pattern="/*" access="hasRole('ROLE_SOFT')"/>
                <form-login login-page="/login.do" />               
                <logout invalidate-session="true"
                    logout-success-url="/"
                    logout-url="/j_spring_security_logout"/>
                </http>

只是个想法。。如果用户第一次使用登录表单登录,并且需要访问需要额外权限的资源,那么为什么不再次将用户重定向回登录页面

    <http auto-config="true" use-expressions="true">
                <intercept-url pattern="/resources/**" access="denyAll"/>
                <intercept-url pattern="/login.do" access="permitAll"/>
                <intercept-url pattern="/role_soft_url_domain/* " access="hasRole('ROLE_SOFT') and fullyAuthenticated"/>
                <intercept-url pattern="/role_hard_url_domain/*" access="hasRole('ROLE_HARD') and fullyAuthenticated"/>             
                <intercept-url pattern="/*" access="hasRole('ROLE_SOFT')"/>
                <form-login login-page="/login.do" />               
                <logout invalidate-session="true"
                    logout-success-url="/"
                    logout-url="/j_spring_security_logout"/>
                </http>