我有一些代码看起来像这样(大大简化的版本)。函数接受两个类型为LoadClient
and的函数参数CheckApproval
,并返回错误或字符串。
pub struct Client {
pub id: String,
}
pub enum MyErr {
RequiresApproval(Client, String),
LoadFailed,
}
pub fn authorize<LoadClient, CheckApproval>(load_client: LoadClient, check_approval: CheckApproval) -> Result<String, MyErr>
where
LoadClient: FnOnce(String) -> Result<Client, String>,
CheckApproval: for<'a> FnOnce(&'a Client, &str) -> Result<&'a str, ()>,
{
let client = load_client("hello".to_string()).map_err(|_| MyErr::LoadFailed)?;
let permission = "something";
// This doesn't compile
// let authorized = check_approval(&client, permission).map_err(|_| MyErr::RequiresApproval(client, permission.to_string()))?;
// Ok(authorized.to_string())
// This version does
match check_approval(&client, permission) {
Err(_) => …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Web应用程序进行前/后注释,但出于某种原因,spring-security没有发生任何事情.
web.xml中:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/rvaContext-business.xml
/WEB-INF/rvaContext-security.xml
</param-value>
</context-param>
<!-- Spring security filter -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rva</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rva</servlet-name>
<url-pattern>/rva/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
rvaContext-security.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<global-method-security pre-post-annotations="enabled"/>
<http use-expressions="true">
<form-login login-page="/login" />
<logout />
<remember-me />
</http>
...
Run Code Online (Sandbox Code Playgroud)
LoginController类:
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(method = RequestMethod.GET)
public String login(ModelMap map){
map.addAttribute("title", "Login: AD Credentials");
return("login");
}
@RequestMapping("/secure") …
Run Code Online (Sandbox Code Playgroud) 当我尝试通过LDAP从数据库验证用户时收到以下错误.
Reason: Cannot pass null or empty values to constructor.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我做错了什么?
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" />
<intercept-url pattern="/administrator.htm" access="ROLE_ADMIN" />
<!-- <form-login login-page="/dashboard.htm" default-target-url="/dashboard.htm" authentication-failure-url="/ExceptionPage.jsp" /> -->
<form-login/>
</http>
<authentication-manager>
<authentication-provider>
<!-- <user-service>
<user name="20022263" password="da" authorities="ROLE_USER" />
<user name="20039004" password="da" authorities="ROLE_ADMIN" />
</user-service> -->
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT a.GLOBALID AS username, a.PASSWORD AS password, a.Enabled AS enabled FROM EU_MAS_TBUSER a WHERE a.GLOBALID=?"
authorities-by-username-query="select eu.USERNAME AS username, r.ACCESSROLEID AS …
Run Code Online (Sandbox Code Playgroud) 我最近创建了一个Config
记录类型,其中包含在我的应用程序中使用的数据/函数.例如,让我们说吧
data Config m u = Config
{ issuer :: Text
, loadUser :: LoadUser m u
, authenticate :: Authenticate m
}
Run Code Online (Sandbox Code Playgroud)
我有另一个功能,实际上从配置创建应用程序:
buildServer :: Config -> m Server
buildServer cfg = ...
Run Code Online (Sandbox Code Playgroud)
现在,每次我使用这些记录字段时,我都必须明确地应用它们cfg
来获得我想要的东西:
let someFunction = doSomething (issuer cfg) (loadUser cfg) (authenticate cfg)
Run Code Online (Sandbox Code Playgroud)
以前我只是在相同的范围内创建函数(没有配置数据类型),所以这只是:
let someFunction = doSomething issuer loadUser authenticate
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以说"当我引用这些记录字段时,它们都适用于这个实例"在一段代码中,而不是每次都要重复它?我记得过去曾遇到类似这样的事情,但现在找不到,我可能错了.
我想在我的应用程序中根据用户ROLES设置自定义的登录后目的地.例如:如果尝试访问受保护资源时未提示表单登录,我希望根据不同角色显示不同页面.通过使用target-url我无法做到这一点.我怎么能通过使用Spring安全性来做到这一点?