spring security 基础入门(配置详解)

        Spring Security 是为Java EE项目提供全面安全服务的框架。支持基于配置文件,JDBC,LADP和自定义的验证方式。能够通过URL路径等途径提供安全服务。本文将介绍通过自定义的验证方式,通过URL拦截来使用springsecurity提供的安全服务。


基本配置

  •  首先导入附件中SpringMVC的最小项目baseSpringMvc
  •  添加依赖项目 spring-security-web和spring-security-config。这里使用spring-security4.0.2.RELEASE 依赖spring的版本为4.1.6。若spring低于该版本maven会再导入一个spring版本,造成冗余。


    org.springframework.security
    spring-security-web
    4.0.2.RELEASE


    org.springframework.security
    spring-security-config
    4.0.2.RELEASE

  •  在web.xml中添加springSecurity的filter。

   springSecurityFilterChain
   org.springframework.web.filter.DelegatingFilterProxy


   springSecurityFilterChain
   /*

  • 添加配置文件spring-security.xml



    
        
        
        
        
        
        
        
        
        
        
        
    
    
        
    
    

        http段指定了路径相关的配置。

        Intercept-url 段指定路径拦截权限控制的规则,pattern为匹配的路径模式,access是权限检查的表达式,即springSecurity拦截满足pattern的路径请求,当用户权限满足access所指定的表达式时才能继续访问,否则返回403界面。

        form-login段指定login的配置信息。Login-page用于指定自定义的登陆界面路径,default-target-url指定登陆后默认跳转的路径。

        Logou段配置登出时的相关信息。Logout-success-url配置登出之后默认跳转的页面

        Access-denied-handler配置无权访问时的页面配置。error-page指定使用errorpage的方式提示用户无权访问,error-page的参数为一个路径。

        Csrf 用户防止用户伪造表单提交,csrf在表单中使用如下。  

        Authentication-manager 段配置用户验证相关的信息。

        Authentication-provider为authentication provider的配置,这里可以使用user-service-ref属性向其添加一个自定义的userservice用于用户验证,自定义的userservice必须实现UserDetailsService接口。

        Authentication-provider中还有一些springSecurity内置的authentication可以选择,本文就不做详细介绍了。Authentication-provider中jdbc-user-service元素用于基于数据库的验证详细介绍请参考 http://www.mkyong.com/spring-security/spring-security-form-login-using-database/。Authentication-provider中user-service元素用于在配置文件中静态指定用户账户信息。Authentication-provider中ldap-user-service元素用于配置ldap验证。

  •  创建类 com.springframe.security.userservice.MyUserService

@Component
public class MyUserDetailsService implements UserDetailsService {
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        ArrayList authorities = new ArrayList();
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
        if(s.compareTo("lipore")==0){
            return new User(s,"123456",authorities);
        }else if(s.compareTo("admin")==0){
            authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
            return new User(s,"123456",authorities);
        }
        return null;
    }
}
        MyUserDetailsService 实现UserDetailsService接口。

        LoadUserByUsername在springSecurity进行用户验证的时候掉用来获取一个用户。这里springSecurity提供了一个途径使得开发者可以使用自定义的方式来给spring-Security提供用户信息。通过这个方法我们可以使用数据库,文件等各种形式向springSecurity提供用户用于权限验证。若需要扩展用户信息,请重新实现UserDetails接口。

        SpringSecurity可以使用两种方式来使用数据库。一个方式是在配置中使用jdbc-user-service,另外一个方式是使用自定义userservice 并在自己的loadUserByUsername中获取用户。后者相对于前者来说灵活性更高可以拓展用户信息,但需要做更多的工作。

  • 登录控制器及界面

        这里我们使用自定义的login界面。自定义的登陆界面上我们可以使用验证码,密码加密等。登陆界面表单中必须要元素username和 password,并使用post方式提交到/login路径 (这个路径和我们的控制器无关,springSecurity会自动拦截和跳转)。若启用了csrf别忘了在表单中添加csrf的hiddeninput。登陆界面代码如下。

RBACController.java

@Controller
public class RBACController {
    @RequestMapping(value = "/login",method = RequestMethod.GET)
    public String login(){
        return "login";
    }
}

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Ricky.Gu
  Date: 9/9/2015
  Time: 9:33 AM
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    


User:
Password:
  • 权限控制测试

        Spring-security.xml配置文件中我们指定了两拦截器:一个用于拦截/admin/**需要ROLE_ADMIN权限访问;另外一个用于拦截/user*需要ROLE_USER权限访问。除了两个拦截器拦截的路径外其他路径不需要权限即可访问。

        /welcome 不需要权限即可访问,我们在里面测试下获取用户名。

        /user需要ROLE_USER权限

        /admin/info需要ROLE_ADMIN权限

CommonController.java
@Controller public class CommonController {
    @RequestMapping("/welcome")
    public String welcome(Model model) {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = principal instanceof String ?
                (String) principal :
                (principal instanceof UserDetails ? ((UserDetails) principal).getUsername() : "");
        model.addAttribute("username",username);
        return "welcome";
    }

    @RequestMapping("/user")
    @ResponseBody
    public String userInfo() {
        return "you have user role";
    }

    @RequestMapping("/admin/info")
    @ResponseBody
    public String info(){
        return "you have role admin";
    }
}

Welcome.jsp

<%--
  Created by IntelliJ IDEA.
  User: rgu
  Date: 9/9/2015
  Time: 10:02 AM
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    



welcome:${username}| Logout

*welcome.jsp中的表单用于测试登出操作。


你可能感兴趣的:(Framework)